在SQL Server中,如何使用另一个表中的列名比较行

在SQL Server中,如何使用另一个表中的列名比较行,sql,sql-server,dynamic-sql,dynamic-columns,Sql,Sql Server,Dynamic Sql,Dynamic Columns,我有两个表A和表B,其中包含动态列,除了另一个名为C的表外,我不知道哪些列是其中的键 C表指定哪些列是表a和B中的键列。可以有1个或多个键列 我的问题是,如何生成这样一个查询,从a中选择所有行,其中键列等于B中的相同键列 我的一个想法是创建一个用sp_executesql执行的文本查询,但我需要一些关于如何生成查询的好主意 首先,我将从表A和表B的表C中选择所有键列,然后选择我声明的表@keyColumns 然后我将使用while循环遍历@keyColumns中的所有键列,生成查询并使用sp_e

我有两个表A和表B,其中包含动态列,除了另一个名为C的表外,我不知道哪些列是其中的键

C表指定哪些列是表a和B中的键列。可以有1个或多个键列

我的问题是,如何生成这样一个查询,从a中选择所有行,其中键列等于B中的相同键列

我的一个想法是创建一个用sp_executesql执行的文本查询,但我需要一些关于如何生成查询的好主意

首先,我将从表A和表B的表C中选择所有键列,然后选择我声明的表@keyColumns

然后我将使用while循环遍历@keyColumns中的所有键列,生成查询并使用sp_executesql执行它

例如:

UPDATE A 
SET ... 
FROM B INNER JOIN A 
ON A.keycol1 = B.keycol1 AND A.keycol2 = B.keycol2 AND ...
为了说明这一点,C表只指定表B的键列,因此我知道A具有相同的键列


但是我想知道是否有更好的方法来解决这个问题。

C中的键列是主键吗?如果是这样,您可以按照说明从
信息\u模式.表\u约束
信息\u模式.键\u列\u用法
中检索这些,而不是使用其他表

我认为必须使用动态SQL来实现这一点。主键上没有类似于B JOIN A的
语法。而不是
WHILE
循环,尽管您可以通过
选择
连接查询,如下所示

DECLARE @DynSql nvarchar(max)
DECLARE @TableA sysname
DECLARE @TableB sysname

SET @TableA = 'A'
SET @TableB = 'B';

WITH C AS
(
SELECT 'B' AS [Table], 'keycol2' As col UNION ALL
SELECT 'B' AS [Table], 'keycol1' As col UNION ALL
SELECT 'X' AS [Table], 'keycol1' As col
)

SELECT @DynSql = ISNULL(@DynSql + ' AND ','')+ @TableA + '.'+QUOTENAME(col) + '= ' + @TableB + '.'+QUOTENAME(col)
FROM C WHERE [Table] = @TableB

IF @@ROWCOUNT=0
RAISERROR('No Entry found for table %s',16,1,@TableB)

SET @DynSql = 
'UPDATE ' + @TableA + ' 
SET ... 
FROM ' + @TableB + '  INNER JOIN ' + @TableA + ' ON  
' + @DynSql

PRINT @DynSql

“C”中的键列是否为主键?如果是这样,您可以按照说明从
信息\u模式.表\u约束
信息\u模式.键\u列\u用法
中检索这些,而不是使用其他表

我认为必须使用动态SQL来实现这一点。主键上没有类似于B JOIN A的
语法。而不是
WHILE
循环,尽管您可以通过
选择
连接查询,如下所示

DECLARE @DynSql nvarchar(max)
DECLARE @TableA sysname
DECLARE @TableB sysname

SET @TableA = 'A'
SET @TableB = 'B';

WITH C AS
(
SELECT 'B' AS [Table], 'keycol2' As col UNION ALL
SELECT 'B' AS [Table], 'keycol1' As col UNION ALL
SELECT 'X' AS [Table], 'keycol1' As col
)

SELECT @DynSql = ISNULL(@DynSql + ' AND ','')+ @TableA + '.'+QUOTENAME(col) + '= ' + @TableB + '.'+QUOTENAME(col)
FROM C WHERE [Table] = @TableB

IF @@ROWCOUNT=0
RAISERROR('No Entry found for table %s',16,1,@TableB)

SET @DynSql = 
'UPDATE ' + @TableA + ' 
SET ... 
FROM ' + @TableB + '  INNER JOIN ' + @TableA + ' ON  
' + @DynSql

PRINT @DynSql

非常感谢。这似乎是最好的方法。谢谢。这似乎是最好的办法。