【问题标题】:Replacing a SQL Server subquery in a stored procedure with a string variable用字符串变量替换存储过程中的 SQL Server 子查询
【发布时间】:2018-03-07 15:55:42
【问题描述】:
CREATE PROCEDURE CreateAsset 
    @NumeratorQuery AS TEXT,
    @DenominatorQuery AS TEXT,
    @family AS VARCHAR(255),
    @control_num AS VARCHAR(255),
    @metric_sequence AS VARCHAR(255)
AS
    -- Drop Temporary Tables if they exist
    IF OBJECT_ID('tempdb.dbo.#TempNumerator') IS NOT NULL
        DROP TABLE tempdb.dbo.#TempNumerator

    IF OBJECT_ID('tempdb.dbo.#TempDenominator') IS NOT NULL
        DROP TABLE tempdb.dbo.#TempDenominator

    IF OBJECT_ID('tempdb.dbo.#TempAssets') IS NOT NULL
        DROP TABLE tempdb.dbo.#TempAssets

    IF OBJECT_ID('tempdb.dbo.#TempSummary') IS NOT NULL
        DROP TABLE tempdb.dbo.#TempSummary

    -- Create Temporary Numerator Table
    SELECT * 
    INTO #TempNumerator 
    FROM
        (SELECT DISTINCT AssetID 
         FROM openquery(RISKFABRIC_SACS_PROD, 'SELECT computer_name AS AssetID
                                               FROM SACS_PROD.assets 
                                               WHERE (device_type = "SERVER" OR 
                                                      device_type = "INDETERMINATE" OR 
                                                      device_type = "VIRTUAL MACHINE") 
                                                 AND (status = "ACTIVE (PER DOCUMENTATION)" OR status="ACTIVE (DEFINITIVE)")')
            ) AS #TempNumerator
.
.
.

在上面的存储过程中,我想用@NumeratorQuery 替换子查询中的所有内容,如下所示:

SELECT * 
INTO #TempNumerator 
FROM (@NumeratorQuery) AS #TempNumerator

如何做到这一点?

【问题讨论】:

    标签: sql-server stored-procedures exec temp-tables


    【解决方案1】:

    如果我正确理解您的问题,它将如下所示:

    Create Table #TempNumerator
    (
        field list...
    )
    
    insert into #TempNumerator
    exec (@NumeratorQuery)
    

    【讨论】:

    • 这是我的想法,只是我使用的是 SELECT INTO。问题是我在 EXEC 附近遇到语法错误。即我只是将 exec (@NumeratorQuery) 替换为 xxxxx... 但它给出了语法错误。
    【解决方案2】:
    DECLARE@NumeratorQuery NVARCHAR(500)
        SET@NumeratorQuery ='SELECT DISTINCT AssetID
        FROM openquery(RISKFABRIC_SACS_PROD,'SELECT computer_name AS AssetID
        FROM SACS_PROD.assets
        WHERE(device_type="SERVER"OR
        device_type="INDETERMINATE"OR
        device_type="VIRTUAL MACHINE")
        AND(status="ACTIVE (PER DOCUMENTATION)"OR status="ACTIVE (DEFINITIVE)")'
    
        EXEC(@NumeratorQuery)
    

    【讨论】:

    • 我认为这是我将在我的存储过程之外使用的,尽管引号的嵌套需要一个修复。然后我将该变量与其他 5 个变量一起通过管道传输到我的存储过程...然后您的 exec 行将在该存储过程中,而不是在它旁边... exec 行是问题所在,它会导致语法错误,我不知道不明白为什么
    【解决方案3】:

    我找到了问题的真正根源。旧版本的 MSSQL 不支持将 EXEC 放在 SELECT INTO 语句的 FROM 子句中,但我读过的较新版本支持。

    SELECT * 
    INTO #TempNumerator 
    FROM EXEC(@NumeratorQuery) AS #TempNumerator
    

    这才是真正的根本原因;插入语句不存在相同的限制,因此,这非常有效:

    CREATE TABLE #TempNumerator (AssetID VARCHAR(255))
    INSERT INTO #TempNumerator EXEC(@NumeratorQuery)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 2011-01-31
      相关资源
      最近更新 更多