2014-02-27 5 views
3

나는 delete 일부 tablewhere 값의 모든 rows이 빈 문자열이 필요합니다. (I 비슷한 이름을 가지고 여러 테이블이 있습니다). 근처의 구문이 잘못되었습니다 '='sp_executesql을

나는 문자열에 그 SQL 문을 실행하기 위해 tryed :

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @emptyValue AS NVARCHAR(1) =''  
set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected]+'' 
exec sp_executesql @sql 

을하지만 지금은 한 시간 정도를 알아 내기 위해 tryed Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '='.

오류를 나에게 던져이다. 도움이 될 것입니다.

편집 : 다음은 마지막 할당량을 삭제 한 후의 결과입니다. @tableNamenvarchar(MAX)입니다.

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected]+'' 

변경 그것에 : enter image description here

답변

5

, parameterize 전화를하고 다른 이유 (쿼리 계획의 캐싱 포함) 및 걱정할 필요가 없음 :-) 따옴표를 이스케이프에 대해 :

DECLARE @sql AS NVARCHAR(MAX); 
DECLARE @emptyValue AS NVARCHAR(1) =''; 
set @sql = N'DELETE FROM SampleTable WHERE [email protected]'; 
exec sp_executesql @sql, N'@emptyValue NVARCHAR(1)', @emptyValue = @emptyValue; 

Fiddle

+0

그가 exec를 사용해야한다면 가장 좋은 방법입니다. –

1

당신은 두 따옴표가 SQL 인젝션에 대한 sp_executesql에 대신 문자열 연결을하는

set @sql = N'DELETE FROM SampleTable WHERE Value='[email protected] 

http://sqlfiddle.com/#!3/ce8e3/4

+0

끝에 단일 할당량이있는 나머지 스크립트는 문자열로 처리됩니다. – harry180

+0

@ harry180 - 두 개의 작은 따옴표가 있습니다. 당신은 오직 하나만 필요합니다. 필자는 SQL Fiddle을 사용하여 코드 작업을 시연했습니다. –

+0

@DarrenDavies SQLFiddle에있는 코드가 여기에 게시 한 코드와 다릅니다. 당신의 바이올린에서 :'set @sql = N'DELETE FROM SampleTable WHERE Value = '+ @ emptyValue +' "'- 끝에 두 개의 따옴표가 있음을 주목하십시오. – Bridge

0

당신이 할 수있는 경우에, 나는 StuartLC's answer와 함께 가고 싶어요 - 매개 변수가 명확하게 갈 수있는 방법입니다.

이 방법으로 가야하지만 선택의 여지가없는 경우 수행 할 작업을 보여주기 위해 작은 따옴표를 이스케이프 처리 할 수 ​​있습니다. 값 열은 문자열 (질문에서 @emptyValue으로 설정된 기본값에서 추론 됨)로 나타나므로 따옴표가 필요합니다.

작은 따옴표를 이스케이프하려면 다른 작은 따옴표가 필요합니다. 당신은 항상 PRINT @sql 오히려 맹목적으로 실행하는 것보다, 스크립트를 볼 수

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @emptyValue AS NVARCHAR(1) = '' 
set @sql = N'DELETE FROM SampleTable WHERE Value='''[email protected]+'''' 
exec sp_executesql @sql 

참고 :이 사용 해보세요.

관련 문제