1

我有两个表 A 和 B,有动态列,我不知道其中的关键列是什么,除了另一个名为 C 的表。

C 表指定表 A 和 B 中哪一列是键列。可以有 1 个或多个键列。

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

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

首先,我将从表 C 中为表 A 和 B 选择所有键列到我声明的表 @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 具有相同的键列。

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

4

1 回答 1

1

'C' 中的键列是主键吗?如果是这样,您可以从 中检索这些INFORMATION_SCHEMA.TABLE_CONSTRAINTS,并且INFORMATION_SCHEMA.KEY_COLUMN_USAGE如此处所述而不是使用不同的表。

我认为你必须为此使用动态 SQL。没有像FROM B JOIN A ON PRIMARY KEYS. WHILE虽然您可以通过 a 连接查询而不是循环SELECT,如下所示。

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
于 2010-07-09T10:43:30.897 回答