Чи існує спосіб створення сценарію створення з існуючої таблиці виключно в T-SQL (тобто без використання SMO, оскільки T-SQL не має доступу до SMO). Скажімо, збережена процедура, яка отримує ім’я таблиці і повертає рядок, що містить сценарій створення для даної таблиці?
Тепер дозвольте описати ситуацію, з якою я стикаюсь, оскільки може бути інший спосіб підійти до цього. У мене є екземпляр з кількома десятками баз даних. Усі ці бази даних мають однакову схему, всі ті ж таблиці, індекс тощо. Вони були створені як частина інсталяції програмного забезпечення сторонніх виробників. Мені потрібно мати спосіб працювати з ними, щоб я міг агрегувати дані з них у спеціальному порядку. Приємні люди на dba.se вже мені тут допомогли. Як створити тригер в іншій базі даних?
В даний час мені потрібно знайти спосіб зробити вибір із таблиці в усіх базах даних. Я записав усі імена бази даних у таблицю з назвою, Databasees
і я написав наступний сценарій, щоб виконати оператор select на всіх них:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) =
N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'
DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0
DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
WHILE @DatabaseIDToHandle IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@DatabaseNameToHandle) + '.dbo.sp_executesql'
EXEC @sql @statement
SET @LastDatabaseID = @DatabaseIDToHandle
SET @DatabaseIDToHandle = NULL
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
END
select * from #tmp
DROP TABLE #tmp
Однак сценарій вище не вдається наступним повідомленням:
Явне значення стовпця ідентичності в таблиці "#tmp" можна вказати лише тоді, коли використовується список стовпців та ввімкнено IDENTITY_INSERT.
Додавання цього:
SET IDENTITY_INSERT #tmp ON
не допомагає, оскільки я не можу вказати список стовпців і зберегти його загальним.
У SQL немає можливості вимкнути ідентифікацію даної таблиці. Ви можете лише скинути стовпчик і додати стовпчик, який, очевидно, змінює порядок стовпців. І якщо порядок стовпців зміниться, вам, знову ж таки, потрібно вказати список стовпців, який би відрізнявся залежно від таблиці, яку ви запитуєте.
Тому я думав, чи зможу я отримати сценарій створення таблиці у своєму T-SQL-коді, я міг би маніпулювати нею за допомогою рядкових маніпуляційних виразів, щоб видалити стовпець ідентичності, а також додати стовпчик для імені бази даних до набору результатів.
Чи може хтось придумати порівняно простий спосіб досягти того, що я хочу?