希望我能得到一些帮助,我目前有一个包含3列的表,ID为int,Name varchar(20),ScriptText varchar(500)。 ID只是一个自动增量ID,Name是一个给ScriptText的Name,ScriptText是一段SQL代码,它将返回一个数字或一段文本。 我想要做的是运行每个记录,执行ScriptText,一旦脚本文本被执行并返回一个值存储在一个变量中,我稍后需要将它与另一个表进行比较。我已尝试过各种方法,但我可以执行ScriptText列中的所有代码,但无法将ID或Name存储在变量中,因此我可以使用它们中的所有三个。我遇到过一段看起来应该做我需要它做的但却无法工作的代码。
DECLARE @Table table (RID BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED,
SQLText NVARCHAR(MAX) )
DECLARE @StatementMax INT
,@statementMin INT
,@isTest TINYINT = 0
,@SQLStatement NVARCHAR(MAX)
,@StoreOutputData varchar(1000) = '';
-- Insert SQL Into Temp Table
INSERT INTO @table (SQLText)
VALUES ('SELECT @@Version');
INSERT INTO @table (SQLText)
VALUES ('SELECT SERVERPROPERTY(''ProductVersion'')')
SELECT @statementMAX = MAX(RID), @statementMIN = MIN(RID) FROM @table
IF @isTest = 1 BEGIN SELECT *, @statementMax AS MaxVal, @StatementMin AS MinVal FROM @Table END
-- Start the Loop
WHILE @StatementMax >= @statementMin
BEGIN
SELECT @SQLStatement = SQLText FROM @table WHERE RID = @statementMin
IF @isTest = 1 BEGIN SELECT 'I am executing: ' + @SQLStatement AS theSqlBeingRun, GETDATE(), @statementMin, @StatementMax END
ELSE
BEGIN
EXECUTE sp_ExecuteSQL N'SELECT @OutVariable = CONVERT(NVARCHAR(1000), SERVERPROPERTY(''ProductVersion''))', N'@OutVariable varchar(1000) OUTPUT', @OutVariable = @StoreOutputData OUTPUT;
SELECT @StoreOutputData;
END
DELETE FROM @table WHERE RID = @statementMin
SELECT @statementMIN = MIN(RID) FROM @Table
IF @isTest = 1 BEGIN SELECT * FROM @table END
END
根据DK5进行上述修订
最后执行语句,例如select @@ Version我希望它在输出中显示为
" Microsoft SQL Server 2014 - 12.0.4100.1(X64) 2015年4月20日17:29:27 版权所有(c)Microsoft Corporation Windows NT 6.1(Build 7601:Service Pack 1)上的企业版(64位)"
根据我的SQL安装,但它只是显示
"我正在执行:SELECT @@ Version"
如果有人可以协助让这个例子有效或者对我的问题有更好的建议,那将非常感激。
根据讨论,我的最终结果应该是
RID SQLText
1 Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
2 12.0.4100.1
我已经使用上面的整个语句作为一个例子来放下一切都是不可能的,在一天结束时我有一个目前有19个sql语句的表以及有数据相关的各种列到sql语句,因此我想在运行select语句后返回更多信息。
答案 0 :(得分:0)
问题似乎是您的位标志变量@isTest
。
如果你看一下这段代码:
IF @isTest = 1 BEGIN
SELECT 'I am executing: ' + @SQLStatement AS theSqlBeingRun, GETDATE(), @statementMin, @StatementMax
END ELSE BEGIN
EXECUTE sp_ExecuteSQL @SQLStatement
END
当变量@isTest
设置为1时,不会执行存储在变量@SQLStatement
中的脚本。该脚本将原样附加到SELECT子句中的文本。
如果变量@isTest
设置为1以外的值,则ELSE
的{{1}}分支将被执行,实际执行该语句。
您希望查看的行为可以通过将If Else check
变量转换为1以外的任何值来实现,例如@isTest
。
还有更高级的功能,例如使用CROSS APPLY,但您遇到的问题可能与此标志变量有关。
编辑1: 要从sp_ExecuteSQL获取数据,您可以使用:
DECLARE @isTest int = 0