Sql server 通过执行@Variable2在存储过程中设置@Variable1

Sql server 通过执行@Variable2在存储过程中设置@Variable1,sql-server,tsql,variables,stored-procedures,Sql Server,Tsql,Variables,Stored Procedures,我想通过在存储过程的开始尝试中执行@Counter来设置@Count的值 SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')' 我已经测试了上面的代码,它确实给出了在存储过程之外的普通sql语句中填充@Count变量的预期结果 SET @Counte

我想通过在存储过程的开始尝试中执行@Counter来设置@Count的值

SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')'
我已经测试了上面的代码,它确实给出了在存储过程之外的普通sql语句中填充@Count变量的预期结果

SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')'
填充@Count变量后,我想在print语句中使用它

PRINT '-- No. of Entries in the ' + @TABLE + ' Table = ' + @Count
我尝试了以下两种方法来填充@Count,但两种方法都不起作用

EXEC @Counter

and

EXECUTE sp_executesql (@Counter)
更新:

经过进一步研究,我尝试了以下方法:

DECLARE @Counter NVARCHAR(1000)
SET @Counter = N'DECLARE @Count NVARCHAR(100); SET @COUNT = (SELECT COUNT(UserId) FROM UserGrp WHERE CONVERT(VARCHAR(MAX),UserId) = ''za02'')'
EXECUTE sp_executesql @Counter
Print @Count
但我收到了这个错误: 必须声明标量变量@Count

更新:我的情况的变通方法/解决方案

DECLARE @Counter NVARCHAR(2000)
SET @Counter = 'DECLARE @Count NVARCHAR(100); SET @COUNT = (SELECT COUNT(UserId) FROM UserGrp WHERE CONVERT(VARCHAR(MAX),UserId) = 'to01'); Print '/*  No. of Entries in the UserGrp Table - ' + @Count + ' */''
EXEC (@Counter)

这在结果中为我提供了明确的信息,以决定如何处理从存储过程的其余部分创建的代码。动态SQL需要仔细处理:

DECLARE @Counter NVARCHAR(1000);

DECLARE @COUNT BIGINT;
DECLARE @DATATOFIND VARCHAR(100) = 'za02';
DECLARE @TABLE SYSNAME = N'UserGrp';
DECLARE @COLUMN SYSNAME = N'UserId';

SET @Counter = N'SELECT @COUNT = COUNT(<column_name>) 
FROM <table_name> 
WHERE CONVERT(VARCHAR(MAX),<column_name>) = @DATATOFIND;';

SET @Counter = REPLACE(@Counter, '<column_name>', QUOTENAME(@COLUMN));
SET @Counter = REPLACE(@Counter, '<table_name>', QUOTENAME(@TABLE));

PRINT @Counter; -- debug

EXECUTE sp_executesql @Counter, 
       N'@DATATOFIND VARCHAR(100), @COUNT BIGINT OUTPUT',
       @DATATOFIND,
       @COUNT OUTPUT;

SELECT @COUNT;
最低要求:

参数是参数,不是串联字符串 IdentifierShare列/表名-应使用QUOTENAME函数引用 最好打印查询以查看它是否执行预期的操作 通过将动态查询中设置的参数定义为输出,可以将其传递给外部块
您是否尝试过向调用添加输出参数,如文档页面上的示例C所示?请参阅。如果没有正确引用@COLUMN…,请小心“…”+@COLUMN+“…”可能会被注入。。。。或@Table或parameterized@DateToFind。谢谢您的提醒!此存储过程用于通过SSM查找和更改数据。完成后,它将被删除=我尝试了一点sp_executesql输出。我不知道如何将其纳入我的打印声明中。