gpt4 book ai didi

sql-server - 尝试使用动态 SQL 连接 SQL Server 2008 中的列名

转载 作者:行者123 更新时间:2023-12-03 12:59:08 25 4
gpt4 key购买 nike

使用 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

现在,我意识到这是行不通的,因为有 no natural joins in 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作为逗号分隔的字符串,因为我在动态 SQL 的其他地方使用它 GROUP BY条款。

使用我遗漏的方法,上述失败的方法之一可能会奏效。或者,也许有更好的整体方法。

有什么建议吗?

更新

解决方案结合了下面@usr 和@Karl 的帖子。我使用@usr 的建议来追踪标记化表值 UDF(最终使用 this one )。然后我用了@Karl 的 COALESCE将结果表转换为 WHERE 的示例条款。我还使用了@Karl 的完整示例来解决我刚刚遇到的另一个连接问题。我希望我能为这两个发帖者提供答案状态 - 谢谢你们!

最佳答案

我发现这很有效:

declare @whereClause varchar(8000)
declare @table2 varchar(255)
declare @table1 varchar(255)

set @table1='SomeTable'
set @table2 = 'SomeOtherTable'

SELECT COLUMN_NAME as [joincolumn]
into #join_columns
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @table1
AND COLUMN_NAME not in ('list names of columns that are not to be joined on here')

select @whereClause=coalesce(@whereClause+' and ','')+
'['+@table2+'].'+joincolumn+'=['+@table1+'].'+joincolumn +'
'
from #join_columns

print @whereClause

然后您可以创建一个动态 SQL 脚本并将 WHERE 子句标记到它的后面

关于sql-server - 尝试使用动态 SQL 连接 SQL Server 2008 中的列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11961300/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com