2012-05-08 4 views
3

SQL을 실행하려고하면 @Status 매개 변수의 값이 텍스트이므로 작은 따옴표로 값을 지정하지 않습니다. 따라서이 오류는 입니다.은 잘못된 열 이름입니다.동적 SQL을 사용하는 SQL Server의 열 이름이 잘못되었습니다.

DECLARE 
    @ID int, 
    @Status varchar(150), 
    @StandardOutput varchar(max) = NULL, 
    @StandardError varchar(max) = NULL, 
    @Query Varchar(max), 
    @S1 varchar(max), 
    @S2 varchar(max), 
    @S3 varchar(max) 


SET  @Status = N'Running' 
SET  @StandardError = N'So2234' 
SET  @StandardOutput = Null 
SET @S1 = '' 
SET @ID = 1 
--DECLARE @S1 varchar(max) 
--SET @S1 = N' ' 
IF @Status IS NOT NULL 
    BEGIN 
    SET @S1 = (N', dbo.JobQueue.Status = ' + @Status); 
    END 
IF @StandardError IS NOT NULL 
    BEGIN 
    SET @S1 = @S1 + N', dbo.JobQueue.StandardError = ' + @StandardError 
    END 
IF @StandardOutput IS NOT NULL 
    BEGIN 
    SET @S1 = N', dbo.JobQueue.StandardOutput = ' + @StandardOutput 
    END 

SET @S1 = (N' UPDATE dbo.JobQueue SET ' + SUBSTRING(@S1, 2, LEN(@s1))) + ' '; 
SET @S1 = @S1 + N' WHERE dbo.JobQueue.ID = ' + CONVERT(VARCHAR(12), @ID); 
SELECT @S1 
EXEC(@S1) 

메시지 207, 수준 16, 상태 1, '실행'1 호선
잘못된 열 이름입니다.
메시지 207, 수준 16, 상태 1, 줄 1
잘못된 열 이름을 인쇄 @의 S1의 'So2234'

결과

UPDATE dbo.JobQueue SET dbo.JobQueue.Status = Running, dbo.JobQueue.StandardError = So2234 WHERE dbo.JobQueue.ID = 1 
+0

@ S1 인쇄시 결과를 공유 할 수 있습니까? – HLGEM

+0

print @ S1 Result로 업데이트했습니다. – Mitul

답변

1

이러한 값은 사용자가 알고 있고 UI에 의해 제공되지 않으므로 수동으로 탈출 할 수 있습니다. '실행'값이 일정하지하지만 UI (SQL 주입)에 의해 제공되는 경우 그러나, 이렇게하지

이 시도 :

IF @Status IS NOT NULL 
    BEGIN 
    SET @S1 = (N', dbo.JobQueue.Status = ''' + @Status + '''); 
... 
1

SELECT @S1에서 결과를 확인합니다.

구문 오류가 있어야합니다! 예를 들어, 어딘가에 공백이나 따옴표가없는 것이 주된 이유입니다.


는 업데이트 : 당신이 그들에 따옴표를 놓치고 있도록

UPDATE dbo.JobQueue SET dbo.JobQueue.Status = Running, dbo.JobQueue.StandardError = So2234 WHERE dbo.JobQueue.ID = 1 

실행 및 So2234 prolly, 텍스트 데이터 유형입니다!

+0

예 따옴표가 빠져 있지만 @ s1을 설정하는 동안 따옴표로 지정되며 SQL로 생성 될 때이를 제거합니다. – Mitul

+0

'SET @Status = N ' "실행 중" SET @StandardError = N ""So2234 "' ' 이 시도해보기 –

0

가 왜 비 사용하지 않는 동적 SQL은 여기에?

UPDATE jq 
SET Status = ISNULL(@status, jq.Status) 
    ,StandardError = ISNULL(@StandardError, jq.StandardError) 
    ,StandardOutput = ISNULL(@StandardOutput, jq.StandardOutput)  
FROM dbo.JobQueue jq 
WHERE jq.ID = @id 
+0

오! 그래서 Null 값에 대해 걱정할 필요가 없습니다. 이것은 내가 옳은 것 같아요. 이것은 놀랄 것입니다. – Mitul