T-SQL에서만 기존 테이블에서 작성 스크립트를 생성하는 방법이 있습니까 (T-SQL에는 SMO에 대한 액세스 권한이 없으므로 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'의 ID 열에 대한 명시 적 값은 열 목록이 사용되고 IDENTITY_INSERT가 ON 인 경우에만 지정할 수 있습니다.
이것을 추가 :
SET IDENTITY_INSERT #tmp ON
열 목록을 지정하고 일반으로 유지할 수 없으므로 도움이되지 않습니다.
SQL에서는 주어진 테이블의 ID를 끌 수있는 방법이 없습니다. 열을 삭제하고 열을 추가하면 열 순서가 변경됩니다. 그리고 열 순서가 변경되면 다시 쿼리 할 테이블에 따라 열 목록을 지정해야합니다.
그래서 T-SQL 코드에서 테이블 스크립 생성을 얻을 수 있는지 생각하고 문자열 조작 표현식으로 조작하여 ID 열을 제거 하고 데이터베이스 이름의 열을 결과 세트에 추가 할 수 있다고 생각했습니다 .
누구든지 내가 원하는 것을 달성하는 비교적 쉬운 방법을 생각할 수 있습니까?