'ProductNumber' - sql

I have a few questions I don't have any experience in a SQL, so my questions will looks funny to some experts here (-:
I want to run some checks in my production SQL.
I have a few databases and I want to check some things.
first, I want to check the index so I found this Query on this great website:
SELECT
t.name TableName,
col.name ColumnName,
ind.name IndexName
FROM
sys.indexes ind
INNER JOIN`enter code here`
sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN
sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
sys.tables t ON ind.object_id = t.object_id
WHERE
(ind.is_primary_key = 0
AND t.is_ms_shipped = 0)
ORDER BY
t.name, col.name, ind.name
I don't know how to find t.name or col.name
I have found this Query that can find all the miss details
select * from information_schema.columns where column_name = 'ProductNumber'
But I dont know how to find the 'ProductNumber'
Last one, if I want to change the Snapshot Mode to ON it will ask to restart the server or it will have any impact on some running session or transaction and make any data corruption?

Use col.name like '%ProductNumber%' in where condition
SELECT
t.name TableName,
col.name ColumnName,
ind.name IndexName
FROM
sys.indexes ind
INNER JOIN`enter code here`
sys.index_columns ic ON ind.object_id = ic.object_id and ind.index_id = ic.index_id
INNER JOIN
sys.columns col ON ic.object_id = col.object_id and ic.column_id = col.column_id
INNER JOIN
sys.tables t ON ind.object_id = t.object_id
WHERE
ind.is_primary_key = 0
AND t.is_ms_shipped = 0 and col.name like '%ProductNumber%'
ORDER BY
t.name, col.name, ind.name

Related

Optimization for system views

I have a query for getting columns data from the Microsoft SQL Server database. I need to speed up my query because I will run it multiple times each minute. Currently, my query took about 60ms to execute on SQL Server. It would be awesome too cut it down to 30 or 40ms.
Execution plan: plan
Is there any possible way for optimization?
SELECT
c.name as 'columnName',
t.name as 'dataType',
t.name + '(' + cast(c.max_length as varchar(50)) +')' AS 'dataTypeFull',
ISNULL(sep.value,'') AS 'columnDescription',
CASE
WHEN fk.object_id is not null THEN fk.name ELSE NULL
END AS 'foreignKey',
pk_tab.*,
ISNULL(i.is_primary_key,0) AS 'primaryKey'
FROM
sys.tables tab
INNER JOIN
sys.columns c ON c.object_id = tab.object_id
LEFT OUTER JOIN
sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id
LEFT OUTER JOIN
sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id
LEFT OUTER JOIN
sys.foreign_key_columns fk_cols ON fk_cols.parent_object_id = tab.object_id
AND fk_cols.parent_column_id = c.column_id
LEFT OUTER JOIN
sys.foreign_keys fk ON fk.object_id = fk_cols.constraint_object_id
LEFT OUTER JOIN
sys.tables pk_tab ON pk_tab.object_id = fk_cols.referenced_object_id
LEFT JOIN
sys.extended_properties sep ON c.object_id = sep.major_id
AND c.column_id = sep.minor_id
AND sep.name = 'MS_Description'
JOIN
sys.types t ON c.user_type_id = t.user_type_id
WHERE
c.object_id = Object_id('some-table-name')

Use CTE To Create Subset of Data

I'm wanting to create a subset of data for testing purposes, where I start with a Users table, select X of type a, Y of type b, Z of type c (and so on), and create a new table containing those users. I then need to to create all related tables (with the necessary records), and then all related tables to those...
I'm fairly certain the best way to do this is a recursive common table expression, however I don't have much experience with those and was hoping someone could help me out. So far I have the below, but have noticed two things:
Level 2 seems to contain everything that was in level 1, in addition to the new records I'd expect
This doesn't actually create/insert the records yet (I still need help with that)
WITH cte AS
(
SELECT DISTINCT fk.object_id, fk.schema_id, fk.parent_object_id, fc.parent_column_id, t.schema_id AS referenced_schema_id, fk.referenced_object_id, ic.column_id AS referenced_column_id, 1 AS Level
FROM sys.foreign_keys fk
INNER JOIN sys.tables t ON fk.referenced_object_id = t.object_id
INNER JOIN sys.foreign_key_columns fc ON fk.object_id = fc.constraint_object_id
INNER JOIN sys.indexes i ON fk.referenced_object_id = i.object_id AND i.is_primary_key = 1
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE fk.type = 'F'
AND fk.referenced_object_id = OBJECT_ID(N'dbo.Users', N'U')
UNION ALL
SELECT fk.object_id, fk.schema_id, fk.parent_object_id, fc.parent_column_id, t.schema_id, fk.referenced_object_id, ic.column_id AS referenced_column_id, cte.Level + 1
FROM sys.foreign_keys fk
INNER JOIN sys.tables t ON fk.referenced_object_id = t.object_id
INNER JOIN sys.foreign_key_columns fc ON fk.object_id = fc.constraint_object_id
INNER JOIN sys.indexes i ON fk.referenced_object_id = i.object_id AND i.is_primary_key = 1
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN cte ON fk.referenced_object_id = cte.parent_object_id
WHERE fk.type = 'F'
AND fk.parent_object_id <> cte.referenced_object_id
),
cteHierarchy AS (
SELECT DISTINCT
OBJECT_NAME(cte.object_id) AS ReferringKey,
SCHEMA_NAME(cte.schema_id) AS ReferringSchema,
OBJECT_NAME(cte.parent_object_id) as ReferringTable,
COL_NAME(cte.parent_object_id,cte.parent_column_id) ReferringColumn,
SCHEMA_NAME(cte.referenced_schema_id) AS ReferencedSchema,
OBJECT_NAME(cte.referenced_object_id) as ReferencedTable,
COL_NAME(cte.referenced_object_id,cte.referenced_column_id) ReferencedColumn,
Level
FROM cte
)
SELECT *
FROM cteHierarchy
ORDER BY Level, ReferencedSchema, ReferencedTable, ReferringTable;
Thank you for your assistance!

Getting duplication with inner join and left join

I am trying to fetch following information for the table of the columns :
1) Primary key.
2) IsNullable
3) Is_Identity.
Query :
SELECT c.name 'Column Name',c.is_nullable,c.is_identity,ISNULL(i.is_primary_key, 0) 'Primary Key' FROM sys.columns c INNER JOIN sys.types t ON c.user_type_id = t.user_type_id LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID('[HumanResources].[Employee]')
I am working with Adventure Works database but the problem here is I am getting OrganizationNode column 2 times and I am unable to understand the reason.
For other tables I am not getting this issue but I am only getting this problem for the table [HumanResources].[Employee].
Below is the link to download database bak file :
https://www.dropbox.com/s/nutfat17b73boav/AdvantureWorksSeScript.bak?dl=0
I have also tried distinct but because of that it shuffled up the ordering of the column as you can see in the second output. BirthDate is coming at the top instead of BusinessEntityID.
I would not like to use distinct as my below query is working fine with all other tables but I am not getting why it is giving duplicate columns in case of [HumanResources].[Employee] table or may be I have tested it with few tables and query may not work properly for few other databases.
I am not sure whether my query is correct or not to work in all the scenarios to fetch above 3 things(pk,inullable etc.) which I mention.
Try this
SELECT name,
is_identity,
is_nullable,
is_primary_key
FROM (
SELECT c.name,
c.column_id,
c.is_identity,
c.is_nullable,
ISNULL(i.is_primary_key,0) is_primary_key,
ROW_NUMBER() OVER(PARTITION BY c.name ORDER BY c.name) rn
FROM sys.columns c
JOIN sys.tables t
ON t.object_id = c.object_id
LEFT JOIN sys.index_columns ic
ON c.object_id = ic.object_id AND c.column_id = ic.column_id
LEFT JOIN sys.indexes i
ON i.object_id = ic.object_id AND i.index_id = ic.index_id
WHERE t.name = 'Employee'
)keys
WHERE rn = 1
ORDER BY column_id

Identifying all columns included in composite PK throughout the database

I want to identify all the columns which are part of PK (composite or non-composite) throughout all the tables in my database. How can I do that with a sql statement? Desired result set:
TABLE NAME | COLUMN NAME | DATA TYPE | CONSTRAINT |
in Sql Server exists a system view to show all constraints.
Try this:
select * from sys.key_constraints where type_desc = 'PRIMARY_KEY_CONSTRAINT'
Something like this:
select
t.name as [TABLE NAME],
c.name as [COLUMN NAME],
ty.name as [DATA TYPE],
i.name as [CONSTRAINT]
from sys.index_columns ic
join sys.indexes i
on ic.object_id = i.object_id
and ic.index_id = i.index_id
join sys.columns c
on ic.object_id = c.object_id
and ic.column_id = c.column_id
join sys.tables t
on ic.object_id = t.object_id
join sys.types ty
on c.user_type_id = ty.user_type_id
where i.is_primary_key = 1
I copied this into my snippets folder long ago, so I can't take credit for it, but this works well...
select s.name as TABLE_SCHEMA, t.name as TABLE_NAME, k.name as CONSTRAINT_NAME, c.name as COLUMN_NAME, ic.key_ordinal AS ORDINAL_POSITION
from sys.key_constraints as k
join sys.tables as t
on t.object_id = k.parent_object_id
join sys.schemas as s
on s.schema_id = t.schema_id
join sys.index_columns as ic
on ic.object_id = t.object_id
and ic.index_id = k.unique_index_id
join sys.columns as c
on c.object_id = t.object_id
and c.column_id = ic.column_id
where k.type = 'PK';
SELECT o.name AS TableName, c.Name AS ColumnName, t.name AS DataType, kc.name AS ContraintName
FROM sys.key_constraints kc
INNER JOIN sys.index_columns ic ON kc.parent_object_id = ic.object_id AND kc.unique_index_id = ic.index_id
INNER JOIN sys.columns c ON ic.column_id = c.column_id AND c.object_id = ic.object_id
INNER JOIN sys.objects o ON ic.object_id = o.object_id
INNER JOIN sys.types t ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE kc.type = 'PK'
ORDER BY TableName,ic.key_ordinal

How to Find Which Unique Table Index a SQL Full Text Index Uses

How do you discover the name of the unique table index a full text index references? SQL to generate the response would be most useful, but GUI (SSMS) solution will work too.
This query should do it - works on SQL Server 2005 and up:
SELECT
OBJECT_NAME(fti.object_id) AS 'Table Name',
i.name AS 'Index Name',
c.name AS 'Column Name'
FROM
sys.fulltext_indexes fti
INNER JOIN
sys.index_columns ic ON ic.object_id = fti.object_id AND ic.index_id = fti.unique_index_id
INNER JOIN
sys.columns c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
INNER JOIN
sys.indexes i ON fti.unique_index_id = i.index_id AND fti.object_id = i.object_id
Marc