在SQL Server中,如何使用另一个表中的列名比较行
我有两个表A和表B,其中包含动态列,除了另一个名为C的表外,我不知道哪些列是其中的键 C表指定哪些列是表a和B中的键列。可以有1个或多个键列 我的问题是,如何生成这样一个查询,从a中选择所有行,其中键列等于B中的相同键列 我的一个想法是创建一个用sp_executesql执行的文本查询,但我需要一些关于如何生成查询的好主意 首先,我将从表A和表B的表C中选择所有键列,然后选择我声明的表@keyColumns 然后我将使用while循环遍历@keyColumns中的所有键列,生成查询并使用sp_executesql执行它 例如:在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
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
非常感谢。这似乎是最好的方法。谢谢。这似乎是最好的办法。