运行存储在表SQL Server 2014

时间:2017-02-27 16:59:47

标签: sql sql-server tsql sql-server-2014

希望我能得到一些帮助,我目前有一个包含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语句后返回更多信息。

1 个答案:

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