我正在使用游标创建存储过程,我需要将列的数量存储到变量中。 SQL表示它无法将nvarchar转换为int 我曾尝试使用CONVERT,CAST和EXEC,但无法使其正常工作。 我该如何解决这个问题?
DECLARE @FieldName nvarchar(255);
DECLARE @RequestCode Nvarchar(50);
DECLARE @ReqSQLQuantity nvarchar(max);
DECLARE @Quantity int;
Select @ReqSQLQuantity = concat('select count(*) From (select distinct [', @FieldName , '] from [report_' , @RequestCode , ']) as number')
Set @Quantity = (@ReqSQLQuantity)
Select @Quantity
答案 0 :(得分:3)
另一个更安全的选择是使用像这样的sp_executesql存储过程....
DECLARE @FieldName nvarchar(255);
DECLARE @RequestCode Nvarchar(50);
DECLARE @ReqSQLQuantity nvarchar(max);
DECLARE @Quantity int, @tableName SYSNAME;
SET @tableName = N'report_' + @RequestCode
Select @ReqSQLQuantity = N' select @Quantity = count(*) '
+ N' From (select distinct ' + QUOTENAME(@FieldName)
+ N' from ' + QUOTENAME(@tableName) + N' ) as number'
Exec sp_executesql @ReqSQLQuantity
,N'@Quantity INT OUTPUT'
,@Quantity OUTPUT
Select @Quantity
答案 1 :(得分:2)
Set @Quantite = (@ReqSQLQuantite)
这不是评价,是隐式转换。从NVARCHAR到INT,您正在尝试将SQL查询文本转换为INT,因此出错。
此外,您假设结果与返回值相同,并且可以分配给变量。这是不正确的,SQL执行结果被发送到客户端。要捕获结果,必须使用SELECT分配:SELECT @value =...
。尝试运行@variable = EXEC(...)
不同样的事情。在SELECT结果中考虑与在应用程序中打印相同的方式:打印将一些文本发送到控制台。如果您运行一些伪代码,例如x = print('foo')
,那么' foo'被发送到控制台,x包含print返回的值(无论是什么)。与此伪SQL相同,@x = EXEC('SELECT foo')
将foo
发送到客户端,@ x将是一些数值,这是EXEC返回的值(在正确的示例中,必须使用显式{{ 1}}声明来设置它。)
总的来说,发布的代码绝对不需要捕获值并返回它,它可以简单地执行动态SQL并将结果返回给客户端:
RETURN