2014-07-18 4 views
1

을 사용하지 않고 테이블 복제 데이터베이스 테이블의 복사본을 만들어야합니다. TEXTIMAGE_ON 값을 설정해야합니다.이 값은 생성시에만 만들 수 있으며 나중에 ALTER TABLE에서는 만들 수 없습니다.SELECT TOP (0) * INTO

나는 또한 어떤 데이터베이스 속성도 미리 변경할 수 없습니다. 그래서 기본적으로 NOT :

ALTER DATABASE backoffice MODIFY FILEGROUP filegroup DEFAULT 

난 그냥 사용할 수없는 이유 그게 전부 :

SELECT TOP (0) * INTO [DestinationSchema].[DestinationTable] FROM [SourceSchema].[SourceTable] 

내 테이블을 복제합니다.

나는 기본적으로 스크립트 또는 다른 방법으로 테이블을 만들고 컬럼을 단계별로 복제하는 방법을 찾고있다.

도움에 감사드립니다.

+2

sys.columns를 사용하여 열 목록을 가져올 수 있습니다. 이를 sys.types에 조인하여 데이터 유형을 가져옵니다. 이것을 동적 SQL로 빌드해야하지만 함께 작성하는 것이 좋지 않습니다. –

+0

SQL Server Management Studio에서 테이블 정의를 스크립팅 할 수 있습니다. 가능한 해결책일까요? –

+0

@ GordonLinoff 불행하게도 나는 어떤 테이블이 소스가 될지 미리 알지 못하기 때문에 불행히도 완전히 동 적입니다. – rudimenter

답변

0

이것은 대부분 당신을 거기에 데려다 줄 것입니다. 요구 사항에 따라 수정해야 할 수도 있습니다. 도움이 되었기를 바랍니다.

DECLARE @TableName SYSNAME = 'TableName'; 

DECLARE @SQL VARCHAR(MAX), 
@ColumnList VARCHAR(MAX), 
@Schema VARCHAR(250); 

SELECT @Schema = QUOTENAME(TABLE_SCHEMA) 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME = @TableName; 

SET @SQL = 'CREATE TABLE ' + @Schema + '.' + QUOTENAME(@TableName) + '(' + CHAR(13) + CHAR(10); 

WITH cte_columns 
    AS (
    SELECT 
      CHAR(9) + QUOTENAME(COLUMN_NAME) + ' ' + CASE 
                WHEN DOMAIN_SCHEMA IS NULL THEN '' 
                ELSE QUOTENAME(DOMAIN_SCHEMA) 
                END + '.' + CASE 
                   WHEN DOMAIN_SCHEMA IS NULL THEN DATA_TYPE + QUOTENAME(CHARACTER_MAXIMUM_LENGTH, '(') 
                   ELSE QUOTENAME(DOMAIN_NAME) 
                   END + CASE 
                     WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' 
                     ELSE ' NULL' 
                     END AS ColumnList 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @TableName 
    ) 
    SELECT 
      @ColumnList = COALESCE(@ColumnList + ',' + CHAR(13) + CHAR(10), '') + ColumnList 
    FROM cte_columns; 

SET @SQL = @SQL + @ColumnList + ')'; 

PRINT @SQL; 
+0

"DOMAIN_SCHEMA"및 "DOMAIN_NAME"을 사용하는 이유가 있습니까? 왜냐하면 내 DB에서 항상 NULL입니다. – rudimenter

+0

그 코드 조각은 UDT (사용자 정의 데이터 형식)를 처리하도록 설계되었습니다. 우리 데이터베이스에서 우리는 UDT를 많이 사용하므로이를 처리해야했습니다. 그러나 당신이 그것을 사용하지 않거나 미래에 그것을 사용하는 어떤 범위를 보지 않는다면, 당신은 논리의 그 부분을 꺼내기로 결정할 수 있습니다. 그러나 거기에 문제가 발생해서는 안됩니다. 희망이 귀하의 질문에 대한 답변. –

0

이 작품은 마음에 드시겠습니까?

Select * 
    INTO NewTable 
    FROM table 
    WHERE 1=2 
+1

질문 읽기 – rudimenter

1

이것은 최소한 시작되었습니다. 당신은 아직 여기서해야 할 일이 있지만 이것은 동적 SQL을 구현하는데 필요한 정보를 제공합니다.

declare @TableName sysname = 'YourTable' 

select * 
from sys.columns c 
join sys.types t on c.user_type_id = t.user_type_id 
where c.object_id = object_id(@TableName) 

모든 것을 수용하려면 많은 사례 표현이 필요합니다.

0

이것은 당신이 시작할 수 있어야 당신은 테이블 정의를

SELECT column_name,data_type,is_nullable,--logic for length calculation 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'tablename' 

같은

뭔가를 추출 할 수 INFORMATION_SCHEMA.COLUMNS 뷰를 사용하면 스키마 정의를 구축하기 위해 이러한 쿼리를 통해 커서를 사용할 수 있습니다