Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
运行SQL Server 2014表中存储的SQL语句_Sql_Sql Server_Tsql_Sql Server 2014 - Fatal编程技术网

运行SQL Server 2014表中存储的SQL语句

运行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或名称存储在变量中,因此我可

希望能得到一些帮助,我现在有一个表,有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,如果在您的帮助下重新发布我的整个脚本,会更容易吗?