运行SQL Server 2014表中存储的SQL语句
希望能得到一些帮助,我现在有一个表,有3列,ID int,Name varchar(20),ScriptText varchar(500)。ID只是一个自动增量ID,Name是给ScriptText的名称,ScriptText是一段SQL代码,它将返回一个数字或一段文本。 我要做的是遍历每个记录,执行脚本文本,一旦脚本文本被执行并返回一个要存储在变量中的值,我以后需要将其与另一个表进行比较。我尝试了各种方法,但我可以执行ScriptText列中的所有代码,但无法将ID或名称存储在变量中,因此我可以使用这三种方法。我遇到了一段代码,看起来它应该做我需要它做的事情,但无法使它工作运行SQL Server 2014表中存储的SQL语句,sql,sql-server,tsql,sql-server-2014,Sql,Sql Server,Tsql,Sql Server 2014,希望能得到一些帮助,我现在有一个表,有3列,ID int,Name varchar(20),ScriptText varchar(500)。ID只是一个自动增量ID,Name是给ScriptText的名称,ScriptText是一段SQL代码,它将返回一个数字或一段文本。 我要做的是遍历每个记录,执行脚本文本,一旦脚本文本被执行并返回一个要存储在变量中的值,我以后需要将其与另一个表进行比较。我尝试了各种方法,但我可以执行ScriptText列中的所有代码,但无法将ID或名称存储在变量中,因此我可
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)微软公司
Windows NT 6.1上的企业版(64位)(版本7601:Service Pack 1)
根据我的SQL安装,但它只是显示
“我正在执行:选择@@Version”
如果有人能帮我做这个例子,或者对我的问题有更好的建议,我将不胜感激
根据讨论,我的最终结果应该是
RID SQLText
1 Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
2 12.0.4100.1
我以上面的整个语句为例,写下了所有不可能的事情,在一天结束时,我有一个表,其中当前有19个sql语句,以及包含与sql语句相关数据的各个列,因此,我希望在运行select语句后返回更多信息。问题似乎出在Bit flag变量
@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以外的值,则执行If-ELSE检查的ELSE
分支,该分支实际执行语句
您希望看到的行为可以通过将@isTest
变量移到除1以外的任何值来实现,例如声明@isTest int=0
还有更高级的事情可以做,例如使用交叉应用,但是您面临的问题可能与这个标志变量有关
编辑1:
要从sp_ExecuteSQL获取数据,可以使用以下方法:
DECLARE @StoreOutputData varchar(1000) = '';
EXECUTE sp_ExecuteSQL N'SELECT @OutVariable = CONVERT(NVARCHAR(1000), SERVERPROPERTY(''ProductVersion''))', N'@OutVariable varchar(1000) OUTPUT', @OutVariable = @StoreOutputData OUTPUT;
SELECT @StoreOutputData;
但是您的@IsTest
值可能是1,所以您没有执行该语句,您只是执行选择“我正在执行:”+@SQLStatement
嗨,James,谢谢您,正如您指出的,显而易见的并不那么明显,我想我已经研究这个问题太久了……虽然我想问题是为什么首先在Declare语句中将它默认为1,但我想这是查看其他人的代码而没有完全理解它的一个陷阱。有时使用调试器可能非常有用!感谢DK的回复,昨晚我根据其他建议做了一些尝试,并设法解决了问题,我正在努力解决的是,有没有一种方法可以将sp_ExecuteSQL sql语句的结果分配给一个变量,并在语句成功执行后包含statementMin和statementMax?是的,让我来指导您。这只是一个基本语法,您可以从MSDN中查看。我也在更新代码,以显示从sp_ExecuteSQL
语句中获取输出。嗨,丹,我已经添加了如图所示的修改,首先它要求我声明FetchCustomerTypeKeys,我将其声明为nvarchar,然后收到消息“不允许从数据类型sql_variant隐式转换为varchar。使用CONVERT函数运行此查询。“我希望这一切都适用于我的场景,因为我以前曾尝试过这样做,但出于某种原因,我在sp_executesql命令中返回了所有select的翻转计数,但在将select StoreOutputData语句放在下面时,我也返回了相同的结果,这意味着我在重复呜呼,它不应该是@FetchCustomerTypeKeys
,而应该是@StoreOutputData
。更新命令以转换数据类型并删除错误,请尝试一次。感谢所有的帮助,这不是我以前尝试过并试图理解的,我已经做了您发布的更改,我现在没有收到任何错误,但是发布了两次相同的结果,我得到产品版本两次,没有版本?我目前无法看到如何使用当前设置显示statementMin和statementMax,如果在您的帮助下重新发布我的整个脚本,会更容易吗?