Есть ли способ сгенерировать сценарий создания из существующей таблицы исключительно в 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 установлен в ON.
Добавление этого:
SET IDENTITY_INSERT #tmp ON
не помогает, так как я не могу указать список столбцов и сделать его общим.
В SQL нет способа отключить идентификацию для данной таблицы. Вы можете только удалить столбец и добавить столбец, который, очевидно, меняет порядок столбцов. И если порядок столбцов изменяется, вам снова нужно указать список столбцов, который будет отличаться в зависимости от таблицы, которую вы запрашиваете.
Поэтому я подумал, что если бы я мог получить скрипт создания таблицы в своем коде T-SQL, я мог бы манипулировать им с помощью выражений манипуляции со строками, чтобы удалить столбец идентификаторов, а также добавить столбец для имени базы данных. в набор результатов.
Кто-нибудь может придумать относительно простой способ добиться того, чего я хочу?