Search code examples
sqlsql-serverssms-16

Loop through current table to find if column is a primary key?


I have a temp table called #ColumnList that holds a list of column names. I need to loop through each row in this table and look to see if the column is a primary key. If it is a key then I need to add that column name to a column called PRIMARYKEYCOLUMN.

This is what I have so far but it doesn't work. It throws an error

Cannot insert the value NULL into column 'DataType', table 'tempdb.dbo.#ColumnList__________________0000000B0D8C'; column does not allow nulls. INSERT fails.

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)

The subquery above (without the JOIN #ColumnList cl ON cl.ColumnName = KU.COLUMN_NAME) works fine and returns the results below. The insert doesn't work however.

[PRIMARYKEYCOLUMN]
Column1
Column2
Column3

I need those same columns above to be inserted in the temp table where those same column names exist


Solution

  • An update statement might work, something like :

    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'
            )