2017-02-23 112 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)