Tsql 动态sql使用联接从列中选择特定值
我试图使用动态sql根据字段选择一个值。我有一个用于列名的字段引用表。我遇到的问题当然是动态sql。我的返回结果是从CRA_METRO2_BASE中选择ecoa_代码,例如id=568470。但我真的希望它运行select语句。执行只返回最后一行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
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的工作原理。现在你只是在用这个词。