通过执行@Variable2 在存储过程中设置@Variable1
Set @Variable1 within a stored proc by executing @Variable2
我想通过在存储过程的 Begin Try 中执行 @Counter 来设置 @Count 的值。
SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')'
我已经测试了上面的代码,它确实给了我在存储过程之外的普通 sql 语句中填充 @Count 变量的预期结果。
填充@Count 变量后,我想在打印语句中使用它。
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;
最低人数:
- params是参数,不是拼接的字符串
- 标识符(此处为 column/table 名称)- 应使用
QUOTENAME
函数 引用
- 最好打印查询以查看它是否按照预期进行
- 在动态查询中设置的参数可以通过将它们定义为 OUTPUT
传递到外部块
我想通过在存储过程的 Begin Try 中执行 @Counter 来设置 @Count 的值。
SET @Counter ='SET @Count = (SELECT COUNT(' + @COLUMN + ') FROM ' + @TABLE + ' WHERE CONVERT(VARCHAR(MAX),' + @COLUMN + ') = ''' + @DATATOFIND + ''')'
我已经测试了上面的代码,它确实给了我在存储过程之外的普通 sql 语句中填充 @Count 变量的预期结果。
填充@Count 变量后,我想在打印语句中使用它。
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;
最低人数:
- params是参数,不是拼接的字符串
- 标识符(此处为 column/table 名称)- 应使用
QUOTENAME
函数 引用
- 最好打印查询以查看它是否按照预期进行
- 在动态查询中设置的参数可以通过将它们定义为 OUTPUT 传递到外部块