SQL set变量作为存储过程中查询的结果

时间:2016-05-03 13:42:16

标签: sql-server tsql variables stored-procedures

我正在使用游标创建存储过程,我需要将列的数量存储到变量中。 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

2 个答案:

答案 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