2011-11-25 1 views
1

없는 추가 : 나는 소스 테이블의 모든 열을 확인하고는 대상 테이블에 존재하는지 확인하려면 [출처] 및 [대상]두 테이블의 컬럼을 비교하고 난 두 개의 테이블이 SQL Server 2008을 사용

합니다. 만약 그들이 존재하지 않는다면 난 열을 추가하고 싶습니다.

이 문제를 해결하기위한 절차를 만들었습니다. 내가 고민하는 유일한 방법은 데이터 유형을 올바르게 설정하는 것입니다. 만약 varchar 필드라면 길이를 지정해야합니다. 자사의 int 필드에 내가 필요 없다면 등등. 사용할 수있는 모든 데이터 유형을 개별적으로 처리하지 않고이 작업을 수행 할 수있는 방법이 있습니까?

답변

2

이것은 불완전합니다 ... 내가 잊어 버린 다른 데이터 유형을 처리해야합니다 (나는 어떤 것도 잊어 버린다고 생각하지 않습니다). 그러나 나는 그것을 테스트하고 작동합니다.

질문에 대답하려면 아니요, 데이터 유형을 처리해야합니다.

DECLARE @MasterTable SYSNAME, 
     @SlaveTable  SYSNAME, 
     @txtSQL   VARCHAR(max) 
SELECT @MasterTable = 'orderheader', 
     @SlaveTable = 'orderheader2' 

DECLARE @myTable TABLE 
(
    txtSQL VARCHAR(MAX) 
) 
INSERT INTO @myTable 
( 
    [txtSQL] 
) 
SELECT 'ALTER TABLE [dbo].[' + 
    @SlaveTable + 
    '] ADD [' + 
    a.[name] + 
    '] [' + 
    typ.[name] + 
    ']' + 
    CASE typ.[name] 
     WHEN 'decimal' THEN '(' + CAST(a.[precision] AS VARCHAR(20)) + ',' + CAST(a.[scale] AS VARCHAR(20)) + ')' 
     WHEN 'numeric' THEN '(' + CAST(a.[precision] AS VARCHAR(20)) + ',' + CAST(a.[scale] AS VARCHAR(20)) + ')' 
     WHEN 'varchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     WHEN 'char' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     WHEN 'nvarchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     WHEN 'nchar' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     WHEN 'binary' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     WHEN 'varbinary' THEN '(' + CAST(a.[max_length] AS VARCHAR(20)) + ')' 
     ELSE '' 
    END 
FROM (
      SELECT col.* 
      FROM  sys.tables tbl 
        INNER JOIN sys.columns col 
         ON tbl.[object_id] = col.[object_id] 
      WHERE  tbl.[name] = @MasterTable 
     ) a 
     LEFT JOIN (
        SELECT col.* 
        FROM sys.tables tbl 
          INNER JOIN sys.columns col 
           ON tbl.[object_id] = col.[object_id] 
        WHERE tbl.[name] = @SlaveTable 
       ) b 
      ON a.[name] = b.[name] 
     INNER JOIN sys.types typ 
      ON a.[system_type_id] = typ.[system_type_id] 
WHERE b.name IS NULL 

WHILE EXISTS 
(
    SELECT TOP 1 1 
    FROM @myTable 
) 
BEGIN 
    SELECT TOP 1 @txtSQL = txtSQL FROM @myTable 
    DELETE FROM @myTable WHERE [txtSQL] = @txtSQL 
    EXEC (@txtSQL) 
END 
+0

방금 ​​이걸 보았습니다. 나는 그것을 조사하고 다시 게시 할 것이다! 고마워요! – user829237

관련 문제