Tsql 动态sql使用联接从列中选择特定值

Tsql 动态sql使用联接从列中选择特定值,tsql,dynamic-sql,Tsql,Dynamic Sql,我试图使用动态sql根据字段选择一个值。我有一个用于列名的字段引用表。我遇到的问题当然是动态sql。我的返回结果是从CRA_METRO2_BASE中选择ecoa_代码,例如id=568470。但我真的希望它运行select语句。执行只返回最后一行 DECLARE @BaseCol VARCHAR(250) SELECT @BaseCol = '(SELECT ' + FR_base.field_name + ' FROM CRA_METRO2_BASE WHERE id = ' + CO

我试图使用动态sql根据字段选择一个值。我有一个用于列名的字段引用表。我遇到的问题当然是动态sql。我的返回结果是从CRA_METRO2_BASE中选择ecoa_代码,例如id=568470。但我真的希望它运行select语句。执行只返回最后一行

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)

我不确定我是否正确理解您的前提,并且没有模型。。。;因此,请对这个答案持保留态度:

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)

所以我使用了上面的查询,现在我使用一个CTE来构建我的基本结果列表。在我的cte中,我创建了update语句,然后将它们全部放入临时表中。 我提取update语句并在temp表上执行它们。沃拉,我有我的结果

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

不能那样做。您甚至不知道它是一个有效的列名。它可以一行一行地更改。除了我要将它加入我的Field_Ref表之外,该表将包含我要选择的字段。正在编辑帖子。不,该表将不包含该字段。该表将有一些文本字符,varchar-没有列的数据类型。查询优化器无法使用任何查询的输出生成查询。是的,它将包含列名的文本。有没有办法执行它生成的行?或者我可以选择一条更好的路线。你可以去MSDN学习动态sql的工作原理。现在你只是在用这个词。