Sql 如果某个字段存在,则表的动态并集

Sql 如果某个字段存在,则表的动态并集,sql,sql-server,Sql,Sql Server,在我的示例field1和field2中,我试图在具有特定字段的表上构建一个动态联合。工会已经开始运作了,但在任何一张桌子上都是如此。现在我只需要包括那些有field1和field2的 DECLARE @SQL VARCHAR(max) SET @SQL = '' SELECT @SQL = @SQL + CASE Len(@SQL) WHEN 0 THEN '' ELSE ' UNION ALL ' END + ' SELECT [field1], [field2] FROM dbo.['

在我的示例field1和field2中,我试图在具有特定字段的表上构建一个动态联合。工会已经开始运作了,但在任何一张桌子上都是如此。现在我只需要包括那些有field1和field2的

DECLARE @SQL VARCHAR(max)

SET @SQL = ''

SELECT @SQL = @SQL + CASE Len(@SQL) WHEN 0 THEN '' ELSE ' UNION ALL ' END
+ ' SELECT [field1], [field2] FROM dbo.['
+ NAME + ']'
FROM   sys.tables
WHERE  NAME LIKE 'CUST_TABLE%'

EXEC (@SQL)
我想我需要以某种方式组合此查询:

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME like 'CUST_TABLE%'
and COLUMN_NAME='field1'

你很接近。查询视图信息\u SCHEMA.COLUMNS。聚合每个表名,并通过在HAVING子句中计算表的两列来确保这两列都存在


列,而不是字段…并且“field1”、“field2”中的列名称['+NAME+']”不适合安全注入的SQL。使用QUOTENAME.@Larnu:但是,系统表sys.tables中包含的一行的名称可能会导致havov出现在某些查询的from子句的括号内,这是极不可能的。我认为我们很容易忽略这种可能性。你这么说,@ThorstenKettner,但这并不能改变我和你自己至少看到过一个例子,在这里提问的用户在他们的对象名称中有一个“];发生这种情况的可能性有多小也不意味着你应该使用坏习惯。就像int值永远不能被用来注入动态语句一样,这并不意味着它应该被注入。仍然应该使用sp_executesql对其进行适当的参数化。只有当你认为好的/正确的实践是可以的时候才忽略它,结果只有当它不好的时候你才会这样做。
DECLARE @SQL VARCHAR(max)

SET @SQL = ''

SELECT @SQL = @SQL + CASE Len(@SQL) WHEN 0 THEN '' ELSE ' UNION ALL ' END
                   + ' SELECT [field1], [field2] FROM dbo.[' + table_name + ']'
FROM   information_schema.columns
WHERE  table_name LIKE 'CUST_TABLE%'
GROUP BY table_name
HAVING COUNT(CASE WHEN COLUMN_NAME = 'FIELD1' THEN 1 END) > 0
   AND COUNT(CASE WHEN COLUMN_NAME = 'FIELD2' THEN 1 END) > 0

EXEC (@SQL)