В SQL Server, как я могу сравнить строки, используя имена столбцов из другой таблицы - PullRequest
1 голос
/ 09 июля 2010

У меня есть две таблицы A и B с динамическими столбцами, в которых я понятия не имею, какие столбцы являются ключевыми внутри них, за исключением другой таблицы с именем C.

Таблица C указывает, какой столбец / столбцы является ключомстолбец в таблицах A и B. Может быть 1 или более ключевых столбцов.

Мой вопрос: как мне сгенерировать такой запрос, когда я выбираю все строки из A, где ключевые столбцы равны одному и тому же ключу?столбцы в б?

У меня была одна идея - создать текстовый запрос, который я выполняю с помощью 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 имеет те же ключевые столбцы.

Но я хочу знать, есть ли лучший способ решить эту проблему.

1 Ответ

1 голос
/ 09 июля 2010

Являются ли ключевые столбцы в «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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...