2013-07-22 2 views
1

이 방법을 사용하고 있지만 이것이 작동하지 않는 이유를 알 수 없습니다. 내가 한 테이블의 열에서 최대 값을 그 이전의 최대 값과 시드 ID 열 임시 테이블 변수를 만들십진 변수를 사용하여 테이블 변수를 ID 시드로 어떻게 선언 할 수 있습니까?

DECLARE @columnSeed DECIMAL 
SELECT @columnSeed = MAX([seeded_column]) + 1 FROM [table] (nolock) WHERE [conditions] 
DECLARE @Temp_Table TABLE ([seeded_column] varchar(35) IDENTITY(@columnSeed, 1), [more columns]) 

: SSMS 나에게 잘못된 구문이 아닌 다른 유용한 메시지를 제공하지 않습니다 .

편집 : 좋아, 내가 일을해야하는지있어 생각에 대한 동적 SQL로 주위를 파고,하지만 이후 여전히되지 않습니다 :

DECLARE @columnSeed DECIMAL 
[@columnSeed set properly] 
EXECUTE sp_executesql 
     N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(@seed, 1) NOT NULL [more columns])', 
     N'@seed decimal', 
     @seed = @columnSeed; 

지금 얻을 모든 정보를 내가 '이다 '@seed'근처의 잘못된 구문

+0

왜 그렇게하고 싶습니까? 아마도 당신이 필요로하는 결과를 얻는 더 좋은 방법이있을 것입니다. – HLGEM

답변

0

DDL에서 매개 변수를 사용할 수 없다고 생각합니다. 즉, IDENTITY 절에 @seed을 사용할 수 없습니다. 씨앗을 문자열로 변환하고 DDL에 수동으로 밀어 넣으십시오. 이런 식으로하면 효과가 있습니다. (I는 추가 오류가 있는지 나의 사과, 편리한 SQL Server 인스턴스가없는 점은 다음과 같습니다.. DDL 문에서 매개 변수를 사용하지 마십시오)

DECLARE @columnSeed DECIMAL 
DECLARE @sql NVARCHAR(1024) 

[@columnSeed set properly] 

SET @sql = N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(' || CONVERT(NVARCHAR, @seed) || N', 1) NOT NULL [more columns])'; 

EXECUTE sp_executesql @sql 
1

당신이 변수를 사용할 수 없습니다를 씨앗으로. 잘못된 구문입니다. 테이블 변수는 이미 배치가 실행되고 변수가 할당되기 전에 이미 암시 적으로 생성됩니다.

이렇게하는 유일한 방법은 원하는 쿼리를 연결하여 실행하는 것입니다. 테이블 변수의 모든 용도는 하위 범위에 있어야합니다.

DECLARE @columnSeed DECIMAL(18,0) = 10 

DECLARE @sql NVARCHAR(MAX) = N'DECLARE @Temp TABLE (seeded_column decimal IDENTITY(' + CAST(@columnSeed AS NVARCHAR(19)) +', 1) NOT NULL) 
     INSERT INTO @Temp DEFAULT VALUES; 
     SELECT * FROM @Temp;' 

EXECUTE sp_executesql 
     @sql, 
     N'@seed decimal', 
     @seed = @columnSeed; 

나는 어쨌든 당신이하고있는 일을하는 더 좋은 방법이 있다고 확신합니다.

시드 범위가 0 인 테이블 변수를 선언하고 예를 들어 SELECT 쿼리에 원하는 오프셋을 추가 할 수 있습니다.

DECLARE @columnSeed DECIMAL(18,0) = 10 

DECLARE @Temp TABLE (seeded_column decimal(18,0) IDENTITY(0, 1) NOT NULL) 

INSERT INTO @Temp DEFAULT VALUES; 
INSERT INTO @Temp DEFAULT VALUES; 

SELECT @columnSeed + seeded_column AS psuedo_seeded_column 
FROM @Temp; 

전체적인 필요성은 의심 스러울지라도. 일반적으로 IDENTITY 값이 무엇인지 신경 쓰지 않아야합니다. 이것은 나중에 테이블에 삽입되는 데이터를 준비하는 것이므로 @columnSeed을 삽입하고 OUTPUT 절을 사용하여 ID 값을 삽입하는 것이 더 적절하고 동시성 문제가 발생할 위험이 적습니다.

+0

테이블에서 값을 가져 와서 ID 열로 설정되지 않은 해당 테이블의 필드를 업데이트하지만 ID 열인 것처럼 값을 지정하지만 일부 그룹화도 있습니다 (즉, 이러한 레코드는 동일합니다. 값을 가져 와서 전체 열의 해당 열의 최대 값보다 하나 큰 값으로 A 열을 설정합니다. –

관련 문제