2013-06-12 1 views
1

IDENTITY_INSERT 문제를 방지하기 위해 열 정의가있는 INSERT INTO 문을 동적으로 작성해야합니다. 나는 이미 테이블의 열리스트를 검색하는 방법과 함께 모든 것을 결합하는 방법을 발견했다. 내가 나중에 실행됩니다 문자열을 구축하고 있기 때문에 INSERT INTO 쿼리에서 SUBSTRING 결과를 열 정의로 사용하는 방법은 무엇입니까?

DECLARE @Query nvarchar(4000) 
DECLARE @columnlist nvarchar(4000) 

// Result of this query e.g.: "[cid], [pid], [nid], [uid], [subject]" 
SET @columnlist = (SELECT SUBSTRING((SELECT ', ' + QUOTENAME(COLUMN_NAME) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'from_table' ORDER BY ORDINAL_POSITION FOR XML path('')), 3, 200000)) 

SET @query ='INSERT INTO to_table (' + @columnlist + ') SELECT ' + @columnlist + ' FROM from_table;' 
exec sp_executesql @query 

는 어쨌든 나는이 솔루션과 함께 편안하지 않습니다. 쿼리를 사용하여 솔루션을 찾고 있는데, 이는 직접 실행됩니다. 어떤 제안?

답변

2

동적 SQL은 실제로 유일한 옵션이며 항상 quotename()을 사용하는 것과 같은 우수 사례를 사용하면 안전하고 신뢰할 수 있습니다. 쿼리가 4000자를 넘는 경우 nvarchar(max)을 사용하고 sp_executesql 대신 exec (@query)을 사용해야하는 유일한 다른 문제가 있습니다.

+0

감사합니다. – larrydahooster