使用 SQL Server 2008,我想使用动态 SQL 指定内部联接的列名。我要加入的两个表对于我要加入的列具有相同的名称。我知道 SQL Server 不支持自然连接;如果是这样,动态 SQL 将如下所示:
DECLARE @join_columns AS NVARCHAR(100)
DECLARE @sql_1 AS NVARCHAR(4000)
SET @join_columns = 'Age, Gender'
SET @sql_1 = '
SELECT ' + @join_columns + ', table_1.Field_x , table_2.Field_y
FROM table_1 , table_2
NATURAL JOIN ON ' + @join_columns
EXECUTE sp_executesql @sql_1
现在,我意识到这行不通,因为SQL Server 中没有自然连接。那么,下一个最好的方法是什么?
以下是我未能成功追求的几件事:
标记
@join_columns
并形成一种动态WHERE table_1.<col_1> = table_2.<col_1> [AND...]
的子句。但是,看起来 T-SQL 没有字符串标记化功能。使用动态 SQL 制作临时表,每个表都有一个名为的新键列
temp_key
,它是@join_column
. 如果动态连接这些很容易,那么最终的连接可能总是ON #temp_table_1.temp_key = #temp_table_2.temp_key
. 一种设置方法是使用该REPLACE
函数将逗号替换为@join_column
加号。我在这里遇到的问题是连接需要对非VARCHAR
列进行强制转换。所以,我必须提前知道列类型——回到第一方。
理想情况下,我想保留@join_columns
为逗号分隔的字符串,因为我在动态 SQLGROUP BY
子句的其他地方使用它。
可能是上述失败的方法之一可以使用我错过的东西。或者,也许有更好的整体方法。
有什么建议么?
更新
解决方案是下面@usr 和@Karl 的帖子的组合。我使用@usr 的建议来追踪一个标记化的表值 UDF(最终选择了这个)。然后我使用@Karl 的COALESCE
示例将结果表转换为WHERE
子句。我还使用了@Karl 的完整示例来解决我刚刚遇到的另一个连接问题。我希望我能给两张海报提供答案状态 - 谢谢大家!