Прокрутите текущую таблицу, чтобы найти, является ли столбец первичным ключом? - PullRequest
0 голосов
/ 26 марта 2019

У меня есть временная таблица с именем #ColumnList, которая содержит список имен столбцов. Мне нужно перебрать каждую строку в этой таблице и посмотреть, является ли столбец первичным ключом. Если это ключ, то мне нужно добавить имя этого столбца в столбец с именем PRIMARYKEYCOLUMN.

Это то, что у меня есть, но оно не работает. Выдает ошибку

Невозможно вставить значение NULL в столбец 'DataType', таблица 'tempdb.dbo. # ColumnList __________________ 0000000B0D8C'; столбец не допускает пустых значений. Вставить не удается.

ALTER TABLE #ColumnList
ADD PRIMARYKEYCOLUMN VARCHAR(50);

INSERT INTO #ColumnList ([PRIMARYKEYCOLUMN])
(SELECT DISTINCT KU.column_name as PRIMARYKEYCOLUMN 
FROM 
sys.columns c 
       JOIN sys.types t ON t.user_type_id = c.user_type_id
                        AND t.system_type_id = c.system_type_id      
JOIN sys.tables tab ON c.object_id = tab.object_id
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC ON TC.TABLE_NAME = tab.name 
INNER JOIN
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU
          ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
             TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME AND 
             KU.table_name='myTableName'    
JOIN #ColumnList cl ON cl.ColumnName = KU.COLUMN_NAME)

Выше подзапрос (без JOIN #ColumnList cl ON cl.ColumnName = KU.COLUMN_NAME) работает нормально и возвращает результаты ниже. Однако вставка не работает.

[PRIMARYKEYCOLUMN]
Column1
Column2
Column3

Мне нужно, чтобы те же столбцы, которые указаны выше, были вставлены во временную таблицу, где существуют те же имена столбцов.

1 Ответ

2 голосов
/ 26 марта 2019

Оператор обновления может работать, что-то вроде:

update
    #ColumnList  
set
    PRIMARYKEYCOLUMN = ColumnName 
where
    ColumnName in (
        SELECT
            DISTINCT KU.column_name  
        FROM
            sys.columns c         
        JOIN
            sys.types t 
                ON t.user_type_id = c.user_type_id                         
                AND t.system_type_id = c.system_type_id       
        JOIN
            sys.tables tab 
                ON c.object_id = tab.object_id 
        JOIN
            INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
                ON TC.TABLE_NAME = tab.name  
        INNER JOIN
            INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KU           
                ON TC.CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND              TC.CONSTRAINT_NAME = KU.CONSTRAINT_NAME 
                AND               KU.table_name='myTableName'
        )
...