簡體   English   中英

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

[英]In SQL Server, how can I compare rows using the column names from another table

我有兩個表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”主鍵中? 如果是這樣,您可以按照此處所述從INFORMATION_SCHEMA.TABLE_CONSTRAINTSINFORMATION_SCHEMA.KEY_COLUMN_USAGE檢索這些,而不是使用其他表。

我認為您必須為此使用動態SQL。 沒有像FROM B JOIN A ON PRIMARY KEYS這樣的語法。 盡管您可以通過以下SELECT串聯查詢,而不是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM