1

2つのテーブルAとBがあり、Cと呼ばれる別のテーブルを除いて、どの列がキーであるかわからない動的列があります。

Cテーブルは、テーブルAおよびBのキー列がどの列であるかを指定します。1つ以上のキー列が存在する場合があります。

私の質問は、キー列がBの同じキー列と等しいAからすべての行を選択するようなクエリをどのように生成するのでしょうか?

私が持っていたアイデアの1つは、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が同じキー列を持っていることがわかります。

しかし、これを解決するためのより良い方法があるかどうか知りたいです。

4

1 に答える 1

1

「C」に保持されているキー列は主キーですか?もしそうなら、別のテーブルを使用するのではなく、ここで説明されているようINFORMATION_SCHEMA.TABLE_CONSTRAINTSに、からこれらを取得できます。INFORMATION_SCHEMA.KEY_COLUMN_USAGE

これには動的SQLを使用する必要があると思います。のような構文はありませんFROM B JOIN A ON PRIMARY KEYS。ループの代わりに、以下WHILEのようにクエリを連結することができます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 に答える