http://www.sql-server-helper.com/functions/metadata-functions/index.aspx
http://sqlmag.com/t-sql/partitioned-indexes-and-querying-metadata
--查询表结构,函数,触发器,存储过程,视图的结构,主键,外键等关系
--https://msdn.microsoft.com/en-us/library/ms187812.aspx
select * from LibrarySystem.information_schema.tables
select TABLE_CATALOG, TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH from LibrarySystem.information_schema.columns where table_name = 'StaffList'
select * from LibrarySystem.information_schema.columns where table_name = 'StaffList'
select * from information_schema.columns
select * from information_schema.CHECK_CONSTRAINTS
select * from information_schema.COLUMN_DOMAIN_USAGE
select * from information_schema.COLUMN_PRIVILEGES
select * from information_schema.CONSTRAINT_COLUMN_USAGE
select * from information_schema.CONSTRAINT_TABLE_USAGE
select * from information_schema.DOMAIN_CONSTRAINTS
select * from information_schema.DOMAINS
select * from information_schema.KEY_COLUMN_USAGE
select * from information_schema.PARAMETERS
select * from information_schema.REFERENTIAL_CONSTRAINTS
select * from information_schema.ROUTINES
select * from information_schema.ROUTINE_COLUMNS
select * from information_schema.SCHEMATA
select * from information_schema.TABLE_CONSTRAINTS
select * from information_schema.TABLE_PRIVILEGES
select * from information_schema.VIEW_COLUMN_USAGE
select * from information_schema.TABLES
select * from information_schema.VIEW_COLUMN_USAGE
select * from information_schema.VIEW_TABLE_USAGE
select * from information_schema.VIEWS
--Metadata queries
SELECT SCHEMA_NAME();
GO
--SQL SERVER 2005 metadata queries
--For User Tables
select * from sys.objects
where Type = 'U'
--For Views
select * from sys.objects
where Type = 'V'
--For Stored Procedures
select * from sys.objects
where Type = 'P'
--For Triggers
select * from sys.objects
where Type = 'TR'
--For Functions
select * from sys.objects
where Type = 'FN'
--
select * from sys.databases
select * from sys.tables
select * from sys.views
select * from sys.triggers
select * from sys.schemas
select * from sys.procedures
--for SQL 2000:
SELECT * -- User tables
FROM sysobjects
WHERE objectproperty( id, N'IsMSShipped' ) = 0
AND objectproperty( id, N'IsTable' ) = 1
SELECT * -- Stored Procs
FROM sysobjects
WHERE objectproperty( id, N'IsMSShipped' ) = 0
AND objectproperty( id, N'IsProcedure' ) = 1
SELECT * -- Functions
FROM sysobjects
WHERE objectproperty( id, N'IsMSShipped' ) = 0
AND ( objectproperty( id, N'IsTableFunction' ) = 1
OR objectproperty( id, N'IsScalarFunction' ) = 1 )
SELECT * -- Views
FROM sysobjects
WHERE objectproperty( id, N'IsMSShipped' ) = 0
AND objectproperty( id, N'IsView' ) = 1
--In SQL Server 2005
SELECT * -- User tables
FROM sys.objects
WHERE objectproperty( object_id, N'IsMSShipped' ) = 0
AND objectproperty( object_id, N'IsTable' ) = 1
SELECT * -- Stored Procs
FROM sys.objects
WHERE objectproperty( object_id, N'IsMSShipped' ) = 0
AND objectproperty( object_id, N'IsProcedure' ) = 1
SELECT * -- Functions
FROM sys.objects
WHERE objectproperty( object_id, N'IsMSShipped' ) = 0
AND ( objectproperty( object_id, N'IsTableFunction' ) = 1
OR objectproperty( object_id, N'IsScalarFunction' ) = 1 )
SELECT * -- Views
FROM sys.objects
WHERE objectproperty( object_id, N'IsMSShipped' ) = 0
AND objectproperty( object_id, N'IsView' ) = 1
--
SELECT
[object_id],
inbound_count = COUNT(CASE t WHEN 'I' THEN 1 END),
outbound_count = COUNT(CASE t WHEN 'O' THEN 1 END)
FROM
(
SELECT [object_id] = referenced_object_id, t = 'I'
FROM sys.foreign_keys
UNION ALL
SELECT [object_id] = parent_object_id, t = 'O'
FROM sys.foreign_keys
) AS c
GROUP BY [object_id];
--http://www.mssqltips.com/sqlservertip/3449/making-sql-server-metadata-queries-easier-with-these-new-views
--http://www.sqlteam.com/article/using-metadata
CREATE VIEW metadata.tables
AS
SELECT
t.[object_id],
[schema] = QUOTENAME(s.name),
[table] = QUOTENAME(t.name),
[object] = QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON t.[schema_id] = s.[schema_id];
--Number of rows and size of the SQL Server table
CREATE FUNCTION metadata.tvf_spaceused
(
@object_id INT
)
RETURNS TABLE
AS
RETURN
(
SELECT
[rows],
reserved_kb = r,
data_kb = p,
index_size_kb = CASE WHEN u > p THEN u - p ELSE 0 END,
unused_kb = CASE WHEN r > u THEN r - u ELSE 0 END
FROM
(
SELECT
r = (SUM (p1.reserved_page_count) + COALESCE(MAX(it.r),0)) * 8,
u = (SUM (p1.used_page_count) + COALESCE(MAX(it.u),0)) * 8,
p = (SUM (CASE WHEN p1.index_id >= 2 THEN 0 ELSE
(p1.in_row_data_page_count + p1.lob_used_page_count + p1.row_overflow_used_page_count)
END) * 8),
[rows] = SUM (CASE WHEN p1.index_id IN (0,1)
THEN p1.row_count ELSE 0 END)
FROM sys.dm_db_partition_stats AS p1
LEFT OUTER JOIN
(
SELECT it.parent_id,
r = SUM(p2.reserved_page_count),
u = SUM(p2.used_page_count)
FROM sys.internal_tables AS it
INNER JOIN sys.dm_db_partition_stats AS p2
ON it.[object_id] = p2.[object_id]
WHERE it.parent_id = @object_id
AND it.internal_type IN (202,204,207,211,212,213,214,215,216,221,222,236)
GROUP BY it.parent_id
) AS it
ON p1.[object_id] = it.parent_id
WHERE p1.[object_id] = @object_id
) AS x);
GO
--
SELECT
-- basic metadata
t.[object_id],
t.[schema],
t.[table],
t.[object],
-- mimic spaceused
su.[rows],
su.reserved_kb,
su.data_kb,
su.index_size_kb,
su.unused_kb
FROM metadata.tables AS t
CROSS APPLY metadata.tvf_spaceused(t.[object_id]) AS su
ORDER BY t.[object];
--Last SQL Server table accessed
CREATE VIEW metadata.table_access
AS
SELECT
[object_id],
last_read = MAX(last_read),
last_write = MAX(last_write)
FROM
(
SELECT [object_id],
last_read = (SELECT MAX(d) FROM (VALUES
(last_user_seek),(last_user_scan),(last_user_lookup))
AS reads(d)),
last_write = (SELECT MAX(d) FROM (VALUES
(last_user_update))
AS writes(d))
FROM sys.dm_db_index_usage_stats
) AS x GROUP BY [object_id];
--All kinds of data about SQL Server columns
CREATE VIEW metadata.columns
AS
SELECT
c.[object_id],
column_count = COUNT(c.column_id),
column_list = STUFF((SELECT N',' + QUOTENAME(name)
FROM sys.columns AS c2
WHERE c2.[object_id] = c.[object_id]
ORDER BY c2.column_id
FOR XML PATH, TYPE).value(N'.[1]',N'nvarchar(max)'),1,1,N''),
has_identity_column = COUNT(NULLIF(c.is_identity,0)),
computed_column_count = COUNT(NULLIF(c.is_computed,0)),
persisted_computed_column_count = COUNT(NULLIF(cc.is_persisted,0)),
LOB_column_count = COUNT
(
CASE
WHEN c.system_type_id IN (34,35,99,241) THEN 1
WHEN c.system_type_id IN (165,167,231) AND c.max_length = -1 THEN 1
END
),
XML_column_count = COUNT(CASE WHEN c.system_type_id = 241 THEN 1 END),
spatial_column_count = COUNT(CASE WHEN c.user_type_id IN (129,130) THEN 1 END),
hierarchyid_column_count = COUNT(CASE WHEN c.user_type_id = 128 THEN 1 END),
rowversion_column_count = COUNT(CASE WHEN c.system_type_id = 189 THEN 1 END),
GUID_column_count = COUNT(CASE WHEN c.system_type_id = 36 THEN 1 END),
deprecated_column_count = COUNT(CASE WHEN c.system_type_id IN (34,35,99) THEN 1 END),
alias_type_count = COUNT(NULLIF(t.is_user_defined,0))
FROM sys.columns AS c
INNER JOIN sys.types AS t
ON c.system_type_id = t.system_type_id
LEFT OUTER JOIN sys.computed_columns AS cc
ON c.[object_id] = cc.[object_id]
AND c.column_id = cc.column_id
GROUP BY c.[object_id];
--All kinds of data about SQL Server indexes
CREATE VIEW metadata.indexes
AS
SELECT
i.[object_id],
i.has_clustered_index,
i.has_primary_key,
i.unique_index_count,
i.filtered_index_count,
p.nonclustered_index_count,
p.xml_index_count,
p.spatial_index_count
FROM
(
SELECT [object_id],
has_clustered_index = MIN(index_id),
has_primary_key = MAX(CONVERT(TINYINT,is_primary_key)),
unique_index_count = COUNT(CASE WHEN is_unique = 1 THEN 1 END),
filtered_index_count = COUNT(CASE WHEN has_filter = 1 THEN 1 END)
FROM sys.indexes AS i
GROUP BY i.[object_id]
) AS i
LEFT OUTER JOIN
(
SELECT [object_id],
nonclustered_index_count = COALESCE([2],0),
xml_index_count = COALESCE([3],0),
spatial_index_count = COALESCE([4],0)
-- columnstore, hash etc. too if you like
FROM
(
SELECT [object_id], [type], c = COUNT(*)
FROM sys.indexes
GROUP BY [object_id], [type]
) AS x
PIVOT (MAX(c) FOR type IN ([2],[3],[4],[5],[6],[7])) AS p
) AS p
ON i.[object_id] = p.[object_id];
--Number of default and check SQL Server constraints
CREATE VIEW metadata.constraint_counts
AS
SELECT
[object_id] = parent_object_id,
default_constraint_count = COUNT(CASE t WHEN 'D' THEN 1 END),
check_constraint_count = COUNT(CASE t WHEN 'C' THEN 1 END)
FROM
(
SELECT parent_object_id, t = 'D'
FROM sys.default_constraints
UNION ALL
SELECT parent_object_id, t = 'C'
FROM sys.check_constraints
) AS c
GROUP BY parent_object_id;
--Number of after and instead of SQL Server triggers
CREATE VIEW metadata.trigger_counts
AS
SELECT
[object_id] = parent_id,
after_trigger_count = COUNT(NULLIF(is_instead_of_trigger,1)),
instead_of_trigger_count = COUNT(NULLIF(is_instead_of_trigger,0))
FROM sys.triggers
GROUP BY parent_id;
--SQL Server compression and partition information
CREATE VIEW metadata.basic_storage
AS
SELECT
[object_id],
[data_compression], -- on at least one partition
has_partitions = CASE partition_count WHEN 1 THEN 0 ELSE 1 END,
partition_count
FROM
(
SELECT
[object_id],
[data_compression] = MAX(COALESCE(NULLIF(data_compression_desc,'NONE'),'')),
partition_count = COUNT(*)
FROM sys.partitions
WHERE index_id IN (0,1)
GROUP BY [object_id]
) AS p;
--CREATE VIEW metadata.foreign_key_counts
AS
SELECT
[object_id],
inbound_count = COUNT(CASE t WHEN 'I' THEN 1 END),
outbound_count = COUNT(CASE t WHEN 'O' THEN 1 END)
FROM
(
SELECT [object_id] = referenced_object_id, t = 'I'
FROM sys.foreign_keys
UNION ALL
SELECT [object_id] = parent_object_id, t = 'O'
FROM sys.foreign_keys
) AS c
GROUP BY [object_id];
--Number of SQL Server schema-bound references
CREATE VIEW metadata.schemabound_references
AS
SELECT
t.[object_id],
reference_count = COUNT(*)
FROM metadata.tables AS t
CROSS APPLY sys.dm_sql_referencing_entities(t.[object], N'OBJECT') AS r
WHERE EXISTS
(
SELECT 1
FROM sys.sql_modules AS m
WHERE m.[object_id] = r.referencing_id
AND m.is_schema_bound = 1
)
GROUP BY t.[object_id];
--Pulling it all together
CREATE VIEW metadata.uber_table_info
AS
SELECT
-- basic metadata
t.[object_id],
t.[schema],
t.[table],
t.[object],
-- mimic spaceused
su.[rows],
su.reserved_kb,
su.data_kb,
su.index_size_kb,
su.unused_kb,
-- last access:
ta.last_read,
ta.last_write,
-- column info
c.column_count,
c.column_list,
c.has_identity_column,
c.computed_column_count,
c.persisted_computed_column_count,
c.LOB_column_count,
c.XML_column_count,
c.spatial_column_count,
c.hierarchyid_column_count,
c.rowversion_column_count,
c.GUID_column_count,
c.deprecated_column_count,
c.alias_type_count,
-- index info
i.has_clustered_index,
i.has_primary_key,
i.nonclustered_index_count,
i.unique_index_count,
i.filtered_index_count,
i.xml_index_count,
i.spatial_index_count,
-- constraint info
default_constraint_count = COALESCE(cc.default_constraint_count,0),
check_constraint_count = COALESCE(cc.check_constraint_count,0),
-- trigger info
after_trigger_count = COALESCE(tr.after_trigger_count,0),
instead_of_trigger_count = COALESCE(tr.instead_of_trigger_count,0),
-- storage info
st.[data_compression],
st.has_partitions,
st.partition_count,
-- foreign key counts - inbound, outbound
inbound_fk_count = COALESCE(fk.inbound_count,0),
outbound_fk_count = COALESCE(fk.outbound_count,0),
-- schema-bound references:
schemabound_references = COALESCE(sb.reference_count,0)
FROM metadata.tables AS t
CROSS APPLY metadata.tvf_spaceused(t.[object_id]) AS su
LEFT OUTER JOIN metadata.table_access AS ta
ON t.[object_id] = ta.[object_id]
INNER JOIN metadata.columns AS c
ON t.[object_id] = c.[object_id]
LEFT OUTER JOIN metadata.indexes AS i
ON t.[object_id] = i.[object_id]
LEFT OUTER JOIN metadata.constraint_counts AS cc
ON t.[object_id] = cc.[object_id]
LEFT OUTER JOIN metadata.trigger_counts AS tr
ON t.[object_id] = tr.[object_id]
LEFT OUTER JOIN metadata.basic_storage AS st
ON t.[object_id] = st.[object_id]
LEFT OUTER JOIN metadata.foreign_key_counts AS fk
ON t.[object_id] = fk.[object_id]
LEFT OUTER JOIN metadata.schemabound_references AS sb
ON t.[object_id] = sb.[object_id];
--Performance
SELECT * FROM metadata.uber_table_info ORDER BY [object];
创建带有 FOREIGN KEY的数据表:
SQL Server / Oracle / MS Access
CREATE TABLE Project
(
ProjectID int NOT NULL PRIMARY KEY,
ProjectName varchar(100) NOT NULL,
ProjectManagerId int FOREIGN KEY REFERENCES Employee(EmployeeId)
)
My SQL
CREATE TABLE Project
(
ProjectId int NOT NULL,
ProjectName varchar(100) NOT NULL,
ProjectManagerId int,
PRIMARY KEY (ProjectId ),
FOREIGN KEY (ProjectManagerId) REFERENCES Employee(EmployeeId)
)
如果你想给 foreign key 约束取一个名字:
MySQL / SQL Server / Oracle / MS Access:
CREATE TABLE Project
(
ProjectId int NOT NULL,
ProjectName varchar(100) NOT NULL,
ProjectManagerId int,
PRIMARY KEY (ProjectId ),
CONSTRAINT fk_EmployeeId FOREIGN KEY (ProjectManagerId )
REFERENCES Employee(EmployeeId)
)
使用ALTER TABLE设置 FOREIGN KEY :
SQL Server / MySQL / Oracle / MS Access:
ALTER TABLE Project
ADD FOREIGN KEY (ProjectManagerId )
REFERENCES Employee(EmployeeId)
删除 PRIMARY KEY:
SQL Server / Oracle / MS Access:
ALTER TABLE Project
DROP CONSTRAINT fk_EmployeeId
My SQL:
ALTER TABLE Orders
DROP FOREIGN KEY fk_EmployeeId
https://msdn.microsoft.com/en-us/library/ms189049.aspx
https://technet.microsoft.com/en-us/library/ms189807(v=sql.105).aspx
--http://www.infobarrel.com/15_Sql_Server_Queries
--1. Find Host name, Edition and Version number
SELECT SERVERPROPERTY('MachineName') as Host, SERVERPROPERTY('InstanceName') as Instance, @@VERSION as "Version Number", SERVERPROPERTY('Edition') as Edition, SERVERPROPERTY('ProductLevel') as ProductLevel, Case SERVERPROPERTY('IsClustered') when 1 then 'CLUSTERED' else 'STAND ALONE' end as "Server Type"
--2. Find number of Tables in Database
SELECT COUNT(OBJ.ID) as "Table Count" FROM SYSOBJECTS OBJ WHERE XTYPE='U'
--3. Find number of Stored Procedures in Database
SELECT COUNT(OBJ.ID) as "SP Count" FROM SYSOBJECTS OBJ WHERE XTYPE='P'
--4. Retrieve list of Tables with its row count
SELECT OBJ.NAME as "Table Name", MAX(SI.ROWS) as "Row Count" FROM SYSOBJECTS OBJ, SYSINDEXES SI WHERE OBJ.XTYPE = 'U' AND SI.ID = OBJECT_ID(OBJ.NAME) GROUP BY OBJ.NAME ORDER BY 2 DESC
--5. Find Created and Modified Date for Tables
SELECT NAME as "Table Name", CREATE_DATE as "Created Date",
MODIFY_DATE as "Modified Date" FROM SYS.OBJECTS
WHERE TYPE = 'U' --AND NAME LIKE '%sys_%' ORDER BY 3 DESC
--6. Find Created and Modified Date for Stored Procedures
SELECT NAME as "SP Name", CREATE_DATE as "Created Date",
MODIFY_DATE as "Modified Date" FROM SYS.OBJECTS
WHERE TYPE = 'P' --AND NAME LIKE '%delete%' ORDER BY 3 DESC
--7. Find list of Tables containing a Column Name
SELECT s.[NAME] 'Schema', t.[NAME] 'Table', c.[NAME] 'Column', d.[NAME] 'Data Type', d.[MAX_LENGTH] 'Max Length', c.[IS_IDENTITY] 'Is Id',
c.[IS_NULLABLE] 'Is Nullable', t.[MODIFY_DATE] 'Date Modified', t.[CREATE_DATE] 'Date created' FROM SYS.SCHEMAS s INNER JOIN SYS.TABLES t ON s.SCHEMA_ID= t.SCHEMA_ID INNER JOIN SYS.COLUMNS c ON t.OBJECT_ID= c.OBJECT_ID INNER JOIN SYS.TYPES d ON c.USER_TYPE_ID= d.USER_TYPE_ID WHERE c.NAME like '%backup%'
--8. Find list of Objects containing a Text
SELECT o.NAME FROM SYSCOMMENTS (nolock) AS c INNER JOIN SYSOBJECTS (nolock) AS o ON c.ID = o.id WHERE c.TEXT LIKE '%BACKUP%';
--9. Find physical location of Database file
SELECT DB_NAME(DATABASE_ID) as DatabaseName, NAME, TYPE_DESC,
PHYSICAL_NAME FROM SYS.MASTER_FILES
--10. Find the login with admin level roles
SELECT l.NAME, l.DENYLOGIN, l.ISNTNAME, l.ISNTGROUP, l.ISNTUSER
FROM MASTER.DBO.SYSLOGINS l WHERE l.SYSADMIN = 1 OR l.SECURITYADMIN = 1
--11. Find last Database backup date
SELECT db.NAME, CASE WHEN MAX(b.backup_finish_date) IS NULL THEN 'No Backup' ELSE convert(varchar(100), MAX(b.BACKUP_FINISH_DATE)) END AS last_backup_finish_date FROM SYS.DATABASES db LEFT OUTER JOIN MSDB.DBO.BACKUPSET b ON db.NAME = b.DATABASE_NAME AND b.TYPE = 'D' WHERE db.DATABASE_ID NOT IN (2) GROUP BY db.NAME ORDER BY 2 DESC
--12. Find most intensively read queries in Database
SELECT TOP 50 SUBSTRING(QT.TEXT, (QS.STATEMENT_START_OFFSET/2) +1, ((CASE QS.STATEMENT_END_OFFSET WHEN -1 THEN (QT.TEXT) ELSE QS.STATEMENT_END_OFFSET
END - QS.STATEMENT_START_OFFSET)/2)+1), QS.EXECUTION_COUNT,
QS.TOTAL_LOGICAL_READS, QS.TOTAL_ELAPSED_TIME,
QS.LAST_ELAPSED_TIME, QS.MIN_ELAPSED_TIME, QS.MAX_ELAPSED_TIME, QS.LAST_EXECUTION_TIME, QP.QUERY_PLAN
FROM SYS.DM_EXEC_QUERY_STATS QS CROSS APPLY SYS.DM_EXEC_SQL_TEXT(QS.SQL_HANDLE) QT CROSS APPLY SYS.DM_EXEC_QUERY_PLAN(QS.PLAN_HANDLE) QP WHERE QT.ENCRYPTED=0 ORDER BY QS.TOTAL_LOGICAL_READS DESC, QS.TOTAL_ELAPSED_TIME DESC
--13. Find current users, blocked process, memory, etc.
sp_who2
--14. Find list of index for Tables
SELECT A.NAME TABLE_NAME, B.NAME INDEX_NAME, D.NAME COLUMN_NAME FROM SYS.TABLES A, SYS.INDEXES B, SYS.INDEX_COLUMNS C, SYS.COLUMNS D WHERE A.OBJECT_ID = B.OBJECT_ID AND B.OBJECT_ID = C.OBJECT_ID AND B.INDEX_ID = C.INDEX_ID AND C.OBJECT_ID = D.OBJECT_ID AND C.COLUMN_ID = D.COLUMN_ID --AND A.NAME LIKE '%BACKUP%';
--15. Find Database size and Log file size
WITH FS AS (SELECT DATABASE_ID, TYPE, SIZE * 8.0 / 1024 SIZE
FROM SYS.MASTER_FILES) SELECT NAME, (SELECT SUM(SIZE) FROM FS WHERE TYPE = 0 AND FS.DATABASE_ID = DB.DATABASE_ID) DATAFILESIZEMB, (SELECT SUM(SIZE) FROM FS WHERE TYPE = 1 AND FS.DATABASE_ID = DB.DATABASE_ID) LOGFILESIZEMB FROM SYS.DATABASES DB
查询外键相关的两个表和外键的列
SELECT
OBJECT_NAME(f.parent_object_id) as tbl,
OBJECT_NAME(fc.referenced_object_id) as refTable,
COL_NAME(f.parent_object_id, fc.parent_column_id) as foreignKeyColumnName,
COL_NAME(f.referenced_object_id,fc.referenced_column_id ) as foreignKeyParentColumnName
FROM sys.foreign_keys f
INNER JOIN sys.foreign_key_columns AS fc ON f.OBJECT_ID = fc.constraint_object_id
WHERE f.parent_object_id = OBJECT_ID('dbo.ProjectList')
select * from sys.foreign_keys
select * from sys.foreign_key_columns
SELECT OBJECT_NAME(parent_object_id) from sys.foreign_keys
SELECT OBJECT_NAME(referenced_object_id) from sys.foreign_key_columns