如何使用T-SQL执行保存在表中的SQL语句

Jac*_*rst 7 sql t-sql sql-server

是否可以使用T-SQL执行存储在表中的SQL语句?

DECLARE @Query text
SET @Query = (Select Query FROM SCM.dbo.CustomQuery)
Run Code Online (Sandbox Code Playgroud)

存储在表中的语句是ad-hoc语句,可以是SELECT AT 100*FROM ATable到更复杂的语句:

Select
J.JobName As Job,
JD.JobDetailJobStart AS StartDate,
JD.JobDetailJobEnd AS EndDate,
(
    SELECT (DATEDIFF(dd, JD.JobDetailJobStart, JD.JobDetailJobEnd) + 1) -(DATEDIFF(wk, JD.JobDetailJobStart, JD.JobDetailJobEnd) * 2) -(CASE WHEN DATENAME(dw, JD.JobDetailJobStart) = 'Sunday' THEN -1 ELSE 0 END) -(CASE WHEN DATENAME(dw, JD.JobDetailJobEnd) = 'Saturday' THEN -1 ELSE 0 END)
) AS NumberOfWorkingDays,
JD.JobDetailDailyTarget AS DailyTarget,
JD.JobDetailWeeklyTarget AS WeeklyTarget,
JD.JobDetailRequiredQTY AS RequiredQuantity,
(
    Select SUM(sJL.JobLabourQuantityEmployees) From JobLabour sJL
) AS NumberOfEmployees,
(
    Select 
        SUM((sEM.EmployeeDesignationDefaultRate * sJL.JobLabourQuantityEmployees)*8)*(SELECT (DATEDIFF(dd, JD.JobDetailJobStart, JD.JobDetailJobEnd) + 1) -(DATEDIFF(wk, JD.JobDetailJobStart, JD.JobDetailJobEnd) * 2) -(CASE WHEN DATENAME(dw, JD.JobDetailJobStart) = 'Sunday' THEN -1 ELSE 0 END) -(CASE WHEN DATENAME(dw, JD.JobDetailJobEnd) = 'Saturday' THEN -1 ELSE 0 END))
    from EmployeeDesignation sEM
    Inner join JobLabour sJL on sJL.EmployeeDesignationID = sEM.EmployeeDesignationID
) AS FullEmployeeRate



from Job J
Inner Join JobDetail JD on JD.JobID = J.JobID
Inner Join JobLabour JL on JL.JobID = J.JobID

WHERE J.JobActive = 0
Run Code Online (Sandbox Code Playgroud)

我想执行我从T-SQL声明的@Query变量.这可能吗?(我正在运行MSSQL 2005环境)

Dea*_*nOC 13

您可以使用

EXECUTE sp_executesql @Query
Run Code Online (Sandbox Code Playgroud)

运行你的T-SQL

这是SQL Server 2005的MS docn的链接

http://msdn.microsoft.com/en-us/library/ms188001%28v=sql.90%29.aspx

  • @JacquesBronkhorst - 提示:您可以在存储的查询中放置占位符,例如`{CurrentUserId}`.当您从表中检索查询时,请使用适当的值替换每个_snippet_,例如``CurrentUserId}`可能是`42`.这允许您具有存储的查询,这些查询返回特定于特定用户,客户端,作业等的数据. (2认同)

Che*_*gle 10

上一个答案允许您运行一个语句,并且有效.问题是如何运行存储在表中的SQL语句,我将其作为多个语句执行.对于这个额外的步骤,有一个while循环涉及迭代需要运行的每个语句.

-- Author: Chad Slagle 
DECLARE @Table table (RID BIGINT IDENTITY(1,1) PRIMARY KEY CLUSTERED, 
                        SQLText NVARCHAR(MAX) )

DECLARE  @StatementMax INT 
        ,@statementMin INT
        ,@isTest TINYINT = 1
        ,@SQLStatement NVARCHAR(MAX)
-- Insert SQL Into Temp Table
INSERT INTO @table (SQLText)
VALUES ('SELECT @@Version');
INSERT INTO @table (SQLText)
VALUES ('SELECT SERVERPROPERTY(''ProductVersion'')')
-- Get your Iterator Values
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        -- Get the SQL from the table 

    IF @isTest = 1 BEGIN SELECT 'I am executing: ' + @SQLStatement AS theSqlBeingRun, GETDATE(), @statementMin, @StatementMax END  
    ELSE 
    BEGIN 
        EXECUTE sp_ExecuteSQL @SQLStatement                 -- Execute the SQL 
    END
        DELETE FROM @table WHERE RID = @statementMin        -- Delete the statement just run from the table
        SELECT @statementMIN = MIN(RID)  FROM @Table        -- Update to the next RID
    IF @isTest = 1 BEGIN  SELECT * FROM @table END

END
Run Code Online (Sandbox Code Playgroud)

在Summary中,我创建了一个临时表并在其中放入了一些SQL,使用IDENTITY(RID)字段为while循环提供迭代器.然后运行while循环.在该示例中,您应该返回SQL版本的两个视图.我在2k8上建造了这个,我希望有一天它可以帮助一个人挤出来......