2012-03-19 2 views
0

하나의 테이블이 있는지 확인하는 if 문으로 다음 sql 스크립트를 둘러 쌀 필요가 있습니다. 성명서에는 더 많은 필드가 있지만 아래의 발췌문은 아이디어를 얻기에 충분해야합니다.sql 스크립트, if 및 go 문

if 문으로이 전체 배치를 둘러 쌉니다. 내가 GO를 가져 가면 잘못된 열인 TMP_FIELD에 대해 불평한다.

올바른 방법으로 어떤 방법을 사용할 수 있습니까? 내가하고있는 모든 작업은 여러 필드를 가져 와서 varchar에서 datetime으로 변경하는 것입니다. 이것은 setup.exe 파일의 일부이므로 향후 업그레이드를 위해 한 번만 실행하면됩니다. 특정 테이블이있는 경우 스크립트를 실행하지 않는 것으로 결정하는 방식입니다.

IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD TMP_FIELD datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET TMP_FIELD = modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN modifiedDate 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE ADD modifiedDate datetime 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    UPDATE MY_TABLE SET modifiedDate = TMP_FIELD 
GO 
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'MY_TABLE') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    ALTER TABLE MY_TABLE DROP COLUMN TMP_FIELD 
GO 
+0

GO를 가져갈 때 modifiedDate에 대한 오류가 발생합니다. 그런 뜻 이었습니까? "GO를 꺼내면 _modifiedDate_가 잘못된 열에 대해 불평합니다." –

+0

TMP_FIELD은 (는) 잘못된 열입니다. – Rod

+0

테스트 할 때 테이블 MY_TABLE을 다르게 정의했다고 생각합니다. 나는 테이블 스키마에 modifiedData 열을 포함시키지 않았다. 처음에는 예제를 자세히 읽지 않았으므로 함께 작업하고있는 원래 테이블의 스키마를 이해하지 못했습니다. –

답변

1

열의 유형을 변경하기 위해 체조를 모두 수행 할 필요는 없습니다.

create table MY_TABLE (
    modifiedDate varchar(20) 
) 
go 

insert MY_TABLE (modifiedDate) values ('2012-10-20 17:50:41') 
go 

select * from MY_TABLE 
go 

alter table MY_TABLE alter column modifiedDate datetime 
go 

select * from MY_TABLE 
go 

drop table MY_TABLE 
go 

그래서,이처럼 명령문을 작성

if exists (select table_name from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'MY_TABLE') 
begin 
    alter table MY_TABLE alter column modifiedDate datetime 
end 
0

숙련 된 GO는 TSQL 문 일괄 처리의 끝을 표시합니다. ALTER TABLE과 같은 DDL (데이터 정의 언어) 문과 UPDATE TABLE 같은 DML (데이터 조작 언어) 문을 같은 배치에 함께 사용할 수 없습니다.

각 배치는 자체적으로 컴파일됩니다. 따라서 ALTER TABLE 및 UPDATE TABLE 문이 동일한 일괄 처리에있을 때 실제로 modifiedData 열이 아직 만들어지지 않았으므로 SQL Server에서 업데이트 문을 컴파일 할 수 없습니다.

+0

어떻게 배치 그룹 주위에 조건을 넣으시겠습니까? – Rod

0

'잘못된 열 ..'오류를 해결하려면 동적 SQL을 사용하는 것이 좋습니다. 예 : :

create table dbo.t1 (id int primary key, cola varchar(20)) 
go 

insert dbo.t1 values (1, 'one') 
insert dbo.t1 values (2, 'two') 
go 

if not exists(select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = 't1' and COLUMN_NAME = 'colb') 
BEGIN 
    -- add new column 'colb', and set its value initially to existing values in 'cola' 
    ALTER TABLE dbo.t1 ADD colb varchar(20) 

    DECLARE @v NVARCHAR(500) 
    SET @v = N'UPDATE dbo.t1 SET colb = cola' 
    EXEC (@v) -- use dynamic SQL, otherwise will get Invalid column name colb error.  
END 
GO 

동적 SQL은 최후의 수단으로 고려해야합니다. 데이비드 브라 반트의 대답은 당신의 원래 문제를 해결하는 길로 보인다.