一个sqlserver存储过程,创建时没报错,执行时有错误
createproccp_query@mantypevarchar(20),@namevarchar(50),@typevarchar(10),@numintoutput...
create proc cp_query
@mantype varchar(20),
@name varchar(50),
@type varchar(10),
@num int output
as
begin
exec('select '+@num+'=count(*) from tb_mail where'+ @mantype+'='+@name +'and type='+@type)
end
执行时
declare @num int
exec cp_query 'receiveman','hao@softeem.com','normal',@num output
一直报“=”后面有错误 展开
@mantype varchar(20),
@name varchar(50),
@type varchar(10),
@num int output
as
begin
exec('select '+@num+'=count(*) from tb_mail where'+ @mantype+'='+@name +'and type='+@type)
end
执行时
declare @num int
exec cp_query 'receiveman','hao@softeem.com','normal',@num output
一直报“=”后面有错误 展开
3个回答
展开全部
正确的语句如下:
exec('select @num=count(*) from tb_mail where'+ @mantype+'=@name and type=@type‘)
要注意的就是:如果将数据表中的字段名作为参数进行传参时,要放在引号外面的
给你举个例子:
ALTER PROCEDURE [dbo].[Gets](
@tb varchar(10), --这个参数是为了传参数据库表中的一个字段名
@fieldname varchar(10) --这个参数是为了传参数据库表的表名
)
AS
BEGIN
set xact_abort on
begin transaction
declare @sql_text nvarchar(4000)
set @sql_text = 'select distinct ' + @fieldname + ' from ' + @tb --这两个参数传参的内容都是数据库中有定义的东西(一个是字段,一个是表名),而不是普通的参数,所以这两个参数要放在引号外面,而普通的参数直接放在引号里面即可
exec(@sql_text) --执行此语句
commit transaction
END
exec('select @num=count(*) from tb_mail where'+ @mantype+'=@name and type=@type‘)
要注意的就是:如果将数据表中的字段名作为参数进行传参时,要放在引号外面的
给你举个例子:
ALTER PROCEDURE [dbo].[Gets](
@tb varchar(10), --这个参数是为了传参数据库表中的一个字段名
@fieldname varchar(10) --这个参数是为了传参数据库表的表名
)
AS
BEGIN
set xact_abort on
begin transaction
declare @sql_text nvarchar(4000)
set @sql_text = 'select distinct ' + @fieldname + ' from ' + @tb --这两个参数传参的内容都是数据库中有定义的东西(一个是字段,一个是表名),而不是普通的参数,所以这两个参数要放在引号外面,而普通的参数直接放在引号里面即可
exec(@sql_text) --执行此语句
commit transaction
END
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
拼接的语法上@num是INT型的要转化成字符型,对@num要进行类型转化成varchar
从语句的意义看来看,@num不应该加载'+...+'里,这样的意思是@num的值=count(*),而不是把count(*)赋值给@num,正确的应该是('select @num=count(*) from tb_mail where'+ @mantype+'='+@name +'and type='+@type)
从语句的意义看来看,@num不应该加载'+...+'里,这样的意思是@num的值=count(*),而不是把count(*)赋值给@num,正确的应该是('select @num=count(*) from tb_mail where'+ @mantype+'='+@name +'and type='+@type)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create proc cp_query
@mantype varchar(20),
@name varchar(50),
@type varchar(10),
@num int output
as
BEGIN
DECLARE @s NVARCHAR(2000)
SET @s='select @num=count(*) from tb_mail where '''+ @mantype+'''='''+@name+''' and type='+@type
EXEC sp_executesql @s,N'@num int output',@num OUTPUT
end
go
--执行时
declare @num int
exec cp_query 'receiveman','hao@softeem.com','normal',@num OUTPUT
SELECT @num
go变量传参用sp_executesql
@mantype varchar(20),
@name varchar(50),
@type varchar(10),
@num int output
as
BEGIN
DECLARE @s NVARCHAR(2000)
SET @s='select @num=count(*) from tb_mail where '''+ @mantype+'''='''+@name+''' and type='+@type
EXEC sp_executesql @s,N'@num int output',@num OUTPUT
end
go
--执行时
declare @num int
exec cp_query 'receiveman','hao@softeem.com','normal',@num OUTPUT
SELECT @num
go变量传参用sp_executesql
追问
谢谢,可是执行的时候还是一直报‘normal’列明无效啊
追答
少了引號
create proc cp_query
@mantype varchar(20),
@name varchar(50),
@type varchar(10),
@num int output
as
BEGIN
DECLARE @s NVARCHAR(2000)
SET @s='select @num=count(*) from tb_mail where '''+ @mantype+'''='''+@name+''' and type='''+@type+''''
EXEC sp_executesql @s,N'@num int output',@num OUTPUT
end
go
以下兩個參數是列名還是值,是值加引號,不是參時不用加
@mantype varchar(20),
@name varchar(50),
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询