sql select column names where the column is a key - sql

using this query,
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME <table>
how would i modify it to select only column names that are primary keys? or keys of any type?
Using the same type of select is prefered.

SELECT *
FROM INFORMATION_SCHEMA.Table_Constraints tc
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
ON tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA
AND tc.TABLE_CATALOG = kcu.TABLE_CATALOG
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
WHERE tc.TABLE_NAME = 'table_name'

Related

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

SQL Server Flatten Data - Get Data About a Table and Schema

I'm attempting to get data about a particular given schema and table name. The information I need is column names, data types, nullable or not, and whether it's a foreign or primary key. I've gotten close with the following query:
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, CASE WHEN Z.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END AS IS_PRIMARY_KEY,
CASE WHEN Z.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 1 ELSE 0 END AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
OUTER APPLY
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS Z
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning' ORDER BY C.ORDINAL_POSITION
This gathers the data I need, but it's not "flattened". See image of results:
What I need ideally is for each column to be listed 1 time. In this instance ProductId AND OrganizationExpertId would be listed once with a 1 in IS_PRIMARY_KEY and IS_FOREIGN_KEY. I would still expect ExpertRoles to be in the return with a 0 for both.
This happens because of the join syntax. you need to change your joins in the way below:
SELECT
C.COLUMN_NAME,
C.DATA_TYPE,
C.IS_NULLABLE,
CASE WHEN PKEY.CONSTRAINT_NAME IS NULL THEN 0 ELSE 1 END AS IS_PRIMARY_KEY,
CASE WHEN Z.CONSTRAINT_TYPE IS NULL THEN 0 ELSE 1 END AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
LEFT OUTER JOIN
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS PKEY
ON Z.CONSTRAINT_TYPE = 'PRIMARY KEY'
LEFT OUTER JOIN
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS FKEY
ON Z.CONSTRAINT_TYPE = 'FOREIGN KEY'
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning'
ORDER BY C.ORDINAL_POSITION
or alternatively you can use max with group by
SELECT C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, max(CASE WHEN Z.CONSTRAINT_TYPE = 'PRIMARY KEY' THEN 1 ELSE 0 END) AS IS_PRIMARY_KEY,
max(CASE WHEN Z.CONSTRAINT_TYPE = 'FOREIGN KEY' THEN 1 ELSE 0 END) AS IS_FOREIGN_KEY
FROM INFORMATION_SCHEMA.COLUMNS As C
OUTER APPLY
(SELECT TC.CONSTRAINT_NAME, TC.CONSTRAINT_TYPE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE As CCU ON CCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
WHERE TC.TABLE_SCHEMA = C.TABLE_SCHEMA AND TC.TABLE_NAME = C.TABLE_NAME
AND (TC.CONSTRAINT_TYPE = 'PRIMARY KEY' or TC.CONSTRAINT_TYPE = 'FOREIGN KEY')
AND CCU.COLUMN_NAME = C.COLUMN_NAME)
AS Z
WHERE C.TABLE_NAME = 'ProductExpert'
AND C.TABLE_SCHEMA = 'Learning'
group by C.COLUMN_NAME, C.DATA_TYPE, C.IS_NULLABLE, C.ORDINAL_POSITION
ORDER BY C.ORDINAL_POSITION

Find all tables in database By primaryKey

I'm searching for a query that can retrieve all the tables by the specified key/keys name on a specific database.
Something like this:
SELECT table_name
FROM information_Schema.columns
WHERE column_name='ID_UNICO'
AND Constraint_Type = 'PRIMARY KEY'
I've been searching and the best I could find was:
SELECT Col.Column_Name from
INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab,
INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col
WHERE
Col.Constraint_Name = Tab.Constraint_Name
AND Col.Table_Name = Tab.Table_Name
AND Constraint_Type = 'PRIMARY KEY'
AND Col.Table_Name = '<your table name>'
this retrieves the PK's of a specific table, I want to find table_name BY PK name.
SELECT table_name
FROM information_Schema.columns
WHERE column_name='ID_UNICO'
and ordinal_position = 1;
also found this but this gives me the first column of the table, which doesn't ensure me that it it the PK.
Couldn't find any duplicate either.
Would this work for you?
DECLARE #ColName AS VARCHAR(MAX)
SET #ColName = 'CourseId'
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
COLUMNPROPERTY(OBJECT_ID(TABLE_SCHEMA + '.' + TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
AND COLUMN_NAME = #ColName
You can use this query. Replace 'YOUR_COLUMN_NAME' with your primary key column name.
SELECT Table_Name
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1
and COLUMN_NAME ='YOUR_COLUMN_NAME'
Here you go, join TABLE_CONSTRAINTS to CONSTRAINT_COLUMN_USAGE to tie the constraint name to the column then return your TABLE_NAME:
SELECT CCU.COLUMN_NAME,
CONS.TABLE_NAME
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CCU
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS CONS
ON CONS.CONSTRAINT_NAME = CCU.CONSTRAINT_NAME
WHERE CONS.CONSTRAINT_TYPE = 'PRIMARY KEY'
AND CCU.COLUMN_NAME = 'ID_UNICO'

SQL Server table relationships

SQL Server Mgmt Studio 2005: could someone please help me understand how to view and print the relationships between tables, while showing the columns in the tables. I did it many years ago and have been struggling for days to do it again.
Right click on the database name, Expand "Database Diagrams" and Select: "New Database Diagram".
You need to create and edit a database diagram, see this Getting started with SQL Server database diagrams and/or Designing Database Diagrams
you can do it with a query as well: SQL SERVER – Query to Display Foreign Key Relationships and Name of the Constraint for Each Table in Database
here is a query that will get the PKs, Check Constraints, and FKs to and from #TableName, with multi column constraints in a comma separated list:
DECLARE #TableName varchar(250)
SET #TableName='YourTable'
;WITH AllInfo AS
(
SELECT
tc.TABLE_NAME,tc.CONSTRAINT_NAME, ccu.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON ccu.TABLE_NAME = tc.TABLE_NAME AND ccu.CONSTRAINT_NAME = tc.CONSTRAINT_NAME
WHERE tc.TABLE_NAME =#TableName
UNION
SELECT
FK.TABLE_NAME,C.CONSTRAINT_NAME,CU.COLUMN_NAME
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS C
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK ON C.CONSTRAINT_NAME = FK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK ON C.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU ON C.CONSTRAINT_NAME = CU.CONSTRAINT_NAME
INNER JOIN (SELECT i1.TABLE_NAME, i2.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1
INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2 ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME
WHERE i1.CONSTRAINT_TYPE = 'PRIMARY KEY'
) PT ON PT.TABLE_NAME = PK.TABLE_NAME
WHERE PK.TABLE_NAME=#TableName
)
SELECT DISTINCT
t1.TABLE_NAME,t1.CONSTRAINT_NAME
,STUFF(
(SELECT
', ' + t2.COLUMN_NAME
FROM AllInfo t2
WHERE t1.TABLE_NAME=t2.TABLE_NAME AND t1.CONSTRAINT_NAME=t2.CONSTRAINT_NAME
ORDER BY t2.COLUMN_NAME
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,2, ''
) AS ColumnNames
FROM AllInfo t1
ORDER BY 1,2,3
You can create a Database Diagram and add all your tables to it. It will be a graphical representation if that's what you want.
you can use the following script in order to find all the fk,pk relationship for specific table
DECLARE #tablename VARCHAR(100)
SET #tablename='xxxxxxx'
Select 'Referenced by FK table' AS Type, FK.TABLE_SCHEMA, FK.TABLE_NAME AS 'FK_TABLE_NAME' ,cu.COLUMN_NAME AS 'FK_ReferencingColumn',PK.TABLE_NAME AS 'PK_TABLE_NAME',
ku.COLUMN_NAME AS 'PK_ReferencedColumn'
From INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS As RC
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As PK
On PK.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FK
On FK.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu
ON cu.CONSTRAINT_NAME = Rc.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
ON ku.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
Where
PK.TABLE_NAME = #tablename
UNION
SELECT 'Referencing PK table' AS Type, FK.TABLE_SCHEMA, FK.TABLE_NAME AS 'FK_TABLE_NAME' ,cu.COLUMN_NAME AS 'FK_ReferencingColumn',PK.TABLE_NAME AS 'PK_TABLE_NAME',
ku.COLUMN_NAME AS 'PK_ReferencedColumn'
From INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS As RC
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As PK
On PK.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
Join INFORMATION_SCHEMA.TABLE_CONSTRAINTS As FK
On FK.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu
ON cu.CONSTRAINT_NAME = Rc.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE ku
ON ku.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
Where
fk.TABLE_NAME = #tablename

Query to get all primary keys in a database

Merged with Get a List of all Primary Keys in a Database.
Is this the best way to - Get a List of all Primary Keys in a Database - or is there something better?
SELECT
KCU.TABLE_NAME AS Table_Name,
KCU.CONSTRAINT_NAME AS Constraint_Name,
KCU.COLUMN_NAME AS COLUMN_NAME
FROM
INFORMATION_SCHEMA.TABLE_CONSTRAINTS TC
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU
ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA
AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME
AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA
AND KCU.TABLE_NAME = TC.TABLE_NAME
WHERE
TC.CONSTRAINT_TYPE = 'PRIMARY KEY'
ORDER BY
KCU.TABLE_SCHEMA, KCU.TABLE_NAME, KCU.CONSTRAINT_NAME