2017-02-23 114 views
0

我正在嘗試使用動態sql來選擇基於字段的值。我有一個用於列名稱的字段引用表。我遇到的麻煩當然是動態sql。例如,我的返回結果是(SELECT ecoa_code FROM CRA_METRO2_BASE WHERE id = 568470)。但我真的希望它運行該選擇語句。執行只返回最後一行。動態sql從列中使用連接選擇特定值

DECLARE @BaseCol VARCHAR(250) 
SELECT 
    @BaseCol = '(SELECT ' + FR_base.field_name + ' FROM CRA_METRO2_BASE WHERE id = ' + CONVERT(VARCHAR(15), B.id) + ')' 
FROM CRA_INNOVIS_AUDIT_ERROR_FIELDS E 
LEFT JOIN CRA_METRO2_BASE B 
    ON B.id = E.base_id 
LEFT JOIN CRA_METRO2_FIELD_REF FR_base 
    ON FR_base.id = E.base_field_ref 
WHERE E.audit_id = @audit_id 

EXEC(@BaseCol) 
+0

不能這樣做。你甚至不知道這是一個有效的列名。它可能會將行更改爲行。 – Paparazzi

+0

除了我將它加入到我的Field_Ref表中,該表中將有我選擇的字段。現在編輯帖子。 – Jared

+0

不,該表不會有字段。該表將具有一些文本(char,varchar) - 沒有列的數據類型。查詢優化器不能使用任何查詢的輸出來構建查詢。 – Paparazzi

回答

0

所以我用我的上述查詢,現在我正在使用CTE來建立我的基本結果列表。在我的cte中,我創建了更新語句,然後將它們全部放入臨時表中。 我提取更新語句並在臨時表上執行它們。 walla,我有我的結果!

IF(OBJECT_ID('tempdb..#Temp') IS NOT NULL) 
    BEGIN 
     DROP TABLE #Temp 
    END 

    CREATE TABLE #Temp 
    (
     usb_data VARCHAR(500), 
     cra_data VARCHAR(500) 
    ); 

    WITH ErrorFieldsCTE(id, field, usb_data, cra_data, AUD, SOR, acceptable_variance, is_variance_known, is_reviewed) 
    AS(
     SELECT 
      + 'UPDATE #TEMP SET usb_data = (SELECT ' + FR_base.field_name +' FROM CRA_METRO2_BASE WHERE id = '+ CONVERT(VARCHAR(25), B.id) +') WHERE id = ' + CONVERT(VARCHAR(15), E.id) + ' ' [usb_data], 
      + 'UPDATE #TEMP SET cra_data = (SELECT ' + FR_audit.field_name +' FROM CRA_INNOVIS_INBOUND_AUDIT_INFORMATION WHERE id = '+ CONVERT(VARCHAR(25), A.id) +') WHERE id = ' + CONVERT(VARCHAR(15), E.id) + ' ' [cra_data] 
     FROM CRA_INNOVIS_AUDIT_ERROR_FIELDS E 
     LEFT JOIN CRA_METRO2_BASE B 
      ON B.id = E.base_id 
     LEFT JOIN CRA_INNOVIS_INBOUND_AUDIT_INFORMATION A 
      ON A.id = E.audit_id 
     LEFT JOIN CRA_METRO2_FIELD_REF FR_audit 
      ON FR_audit.id = E.audit_field_ref 
     LEFT JOIN CRA_METRO2_FIELD_REF FR_base 
      ON FR_base.id = E.base_field_ref 
     WHERE E.audit_id = @audit_id 
    ) 

    INSERT INTO #Temp 
    SELECT 
     id, field, usb_data, cra_data, AUD, SOR, acceptable_variance, is_variance_known, is_reviewed 
    FROM ErrorFieldsCTE 

    SELECT -- extract query 
     @usb_data += usb_data + '', 
     @cra_data += cra_data + '' 
    FROM #Temp 

    EXEC(@usb_data) -- updating temp table, selects usb-data 
    EXEC(@cra_data) -- updating temp table, selects cra-data 

    SELECT -- return to web 
     id, field, usb_data, cra_data, AUD, SOR, acceptable_variance, is_variance_known, is_reviewed 
    FROM #Temp 

    IF(OBJECT_ID('tempdb..#Temp') IS NOT NULL) 
    Begin 
     Drop Table #Temp 
    End 
0

我不知道我是否正確理解你的房屋,沒有模擬......;所以請採取一粒鹽:)

DECLARE @sqlstring VARCHAR(MAX) 
SELECT @sqlstring = 'SELECT ' + a.column_name + ' FROM ' + a.[Schema] + '.' + a.table_name 
from (
SELECT TOP 1 T.object_id,OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema], 
    T.[name] AS [table_name], AC.[name] AS [column_name] 
    --,TY.[name] AS system_data_type 
    , AC.[max_length], 
    AC.[precision], AC.[scale], AC.[is_nullable], AC.[is_ansi_padded] 
    ,AC.column_id 
FROM sys.tables AS T 
INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id] 
) a 
SELECT @sqlstring 
EXEC(@sqlstring)