Сценарий:
Вие работите като разработчик на SQL Server / SQL Server DBA за застрахователна компания. Създавате документация за обекти на база данни. Трябва да получите списък с всички таблици от цялата база данни от SQL Server Instance без ограничения на първичния ключ.Решение:
Можем да използваме системни изгледи за списък с таблици с ограничение на първичен ключ или не от всяка база данни. Тъй като заявката трябва да се изпълнява във всяка база данни, за да събере тази информация, трябва да преминем през списък с потребителски бази данни, ще използваме курсора, за да извършим цикъл през всички бази данни на екземпляр на SQL Server. Ще изградим нашия динамичен sql за всяка база данни и ще запазим резултатите във временна таблица и накрая ще изберем записите за показване.USE master GO --Declare Variables DECLARE @DatabaseName AS VARCHAR(500) --Create Temp Table to Save Results IF OBJECT_ID('tempdb..#Results') IS NOT NULL DROP TABLE #Results CREATE TABLE #Results ( ServerName VARCHAR(128) ,DatabaseName VARCHAR(128) ,SchemaName VARCHAR(128) ,TableName VARCHAR(128) ,ColumnName VARCHAR(128) ,ConstraintName VARCHAR(128) ,HasPrimaryKeyConstraint VARCHAR(10) ) DECLARE CUR CURSOR FOR SELECT '[' + NAME + ']' AS DBName FROM sys.databases WHERE NAME NOT IN ( 'master' ,'tempdb' ,'model' ,'msdb' ) OPEN Cur FETCH NEXT FROM Cur INTO @DatabaseName WHILE @@FETCH_STATUS = 0 BEGIN --Build dynamic sql for each database DECLARE @SQL VARCHAR(MAX) = NULL SET @SQL = 'Insert into #Results Select @@ServerName, T.Table_Catalog as DatabaseName, T.Table_Schema AS TableSchema, T.Table_Name AS TableName, CCU.Column_Name AS ColumnName, TC.Constraint_Name AS ConstraintName, Case When TC.Constraint_Name is not Null Then ''Yes'' Else ''No'' End as HasPrimaryKeyConstraint From ' + @DatabaseName + '.information_schema.tables T left join ' + @DatabaseName + '.information_Schema.Table_Constraints TC on T.Table_Catalog=TC.Table_Catalog and T.Table_Schema=TC.Table_Schema and T.Table_Name=TC.Table_Name and TC.Constraint_Type=''PRIMARY KEY'' left JOIN ' + @DatabaseName +
'.Information_Schema.constraint_column_usage CCU on TC.Constraint_Name=CCU.Constraint_Name and TC.Table_Name=CCU.Table_Name and T.Table_Type=''BASE TABLE''' EXEC (@SQL) PRINT @SQL FETCH NEXT FROM Cur INTO @DatabaseName END CLOSE Cur DEALLOCATE Cur --Select all records from temp table SELECT * FROM #ResultsИзпълнявам горната заявка на моя екземпляр на SQL Server и ето списък с таблици от всички бази данни с ограничение за първичен ключ, ако е налично, в противен случай Null. Как да получите всички таблици със или без ограничение на първичен ключ във цялата база данни от екземпляр на SQL Server- SQL Server / Урок за TSQL