2010-05-08 3 views
0

다음 쿼리를 실행하려고합니다. 나는 'CrewID'컬럼이 없기 때문에 스크립트의 일부를 업데이트하여 전달합니다. 하지만 잘못된 개체 CrewID '오류가 발생합니다. 내 조건이 일치하지 않아도 업데이트 부분을 실행하는 이유를 알려주실 수 있습니까? 같은 일을하는 또 다른 방법이 있습니까? 나는 열의 이름을 바꿀 필요가 있지만 이름 바꾸기 전에 다른 열에 데이터를 복사해야하고 스크립트를 여러 번 excute해야 할 필요가있다.테이블 이름 바꾸기 열

if exists (select * from syscolumns where name ='CrewID' and id in (select id from dbo.sysobjects where id = object_id(N'[dbo].[WorkPlanAssignees]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)) 
BEGIN 
update A set A.TempCrewID=B.ID from WorkPlanAssignees A inner join Crew B on A.CrewID=B.ID 
END 
+0

제발, 서식 쿼리 ... – Jonathan

+0

나는 이것에 대한 유일한 원인은, 귀하의 상태가, 생각과 일치한다는 것입니다. 업데이트 부분을 인쇄 문장으로 바꾸어보십시오. – Jonathan

+0

Jonathan, 나는 print 문을 써보려고했는데 인쇄가되지 않는다. 그 문은 인쇄가되지 않는다. 그걸 내가 원하는 블록 안에 넣을 수 없다. – Harendra

답변

0

SQL은 한 줄씩 실행되지 않습니다. 그것은 배치로 컴파일됩니다. 컴파일시 컬럼이 존재하지 않습니다. 따라서 오류가 발생합니다. IF는 부적절합니다.

동적 SQL을 사용하거나 수행하려는 작업을 알려주십시오.

그리고 전에 질문 : 나는이 같은 문제로 실행 및 동적 SQL을 사용하여뿐만 아니라 내가 십자가가 하나 개의 행을 가진 임시 테이블에 가입하여 그것을 해결할 수 있다는 것을 발견

Stored Procedure consist Add column, Update data for that column, and Select all data from that table

+0

고마워 ... 네, 그 컴파일 시간 오류. 나는 동적 SQL이 내 문제를 해결할 것 같아요. – Harendra

0

. 이로 인해 스크립트 컴파일러는 컴파일시 이름이 바뀐 열을 해결하지 못하게했습니다. 아래는 내가 동적 SQL을 사용하지 않고 문제를 해결하기 위해 무슨 짓을했는지의 예입니다

select '1' as SomeText into #dummytable 

update q set q.ValueTXT = convert(varchar(255), q.ValueTXTTMP) from [dbo].[SomeImportantTable] q cross join #dummytable p 
+0

때때로 작동하지 않습니다 (존재하지 않는 테이블에 대한 참조가 지연된 컴파일을 트리거하므로) 신뢰할 수 없다는 것을 발견했습니다. 때로는 파서가 존재하지 않는 테이블을 가져 오기 전에 존재하지 않는 열을 처리 (및 오류)하는 것으로 보입니다. –

0

먼저 이전 테이블의 이름을 변경 :

ALTER TABLE orig_table_name RENAME TO tmp_table_name; 

그런 다음 새 테이블을 만들고, 기존의 테이블에 만에 기반을 업데이트 된 열 이름 :

CREATE TABLE orig_table_name (
    col_a INT 
, col_b INT 
); 

그런 다음 원본 테이블에서 내용을 복사하십시오.

INSERT INTO orig_table_name(col_a, col_b) 
SELECT col_a, colb 
FROM tmp_table_name; 

마지막으로 이전 테이블을 삭제하십시오.

DROP TABLE tmp_table_name; 

모든 것을 BEGIN TRANSACTION에 배치합니다. COMMIT; 아마 좋은 생각입니다.

희망이 있습니다.

관련 문제