2012-02-14 4 views
1

누군가 10 열 작은 따옴표를 여기에 입력해야 열을 저장할 수 있다고 설명 할 수 있습니까? 나는 내가 원하는 원하는 출력을 가지고 때까지 동적 sql에서 따옴표를 이스케이프 처리하기 위해 너무 많은 작은 따옴표를 사용해야하는 이유는 무엇입니까?

exec('UPDATE [SomeTable] SET [SomeColumn] = '''''''''''', [AnotherColumn] = Null ') 

내가 따옴표를 추가 유지 ..이에 논리를 이해하려고 노력 중이 야하지만, 지금은 내가 너무 많은 따옴표를 넣어했던 이유를 알고 싶습니다.

답변

1

과 같을 것이다 테이블에 ''삽입하는 코드 : 다른 문자열 내에서이 작업을 실행하고 있기 때문에

UPDATE [SomeTable] SET [SomeColumn] = '''''', [AnotherColumn] = Null 

그러나이 결과, 이스케이프 따옴표를 탈출해야합니다 당신이 준 코드.

1

12 개의 따옴표가 필요합니다. 문자열의 각 따옴표는 두 번째 따옴표로 이스케이프 처리됩니다. 보통 set column = ''''''을해야하지만, 그 자체가 문자열 안에 있으므로 이스케이프 처리 된 각 따옴표를 두 배로 늘려야하므로 12 개의 따옴표가 생깁니다.

8

실제로 ''을 데이터베이스에 저장하려는 경우 동등한 문자 (CHAR(39))를 사용할 수 있습니다 (사용자의 의도가 빈 문자열을 저장하거나 실제로 두 개의 단일 문자를 저장하는 것이 확실하지 않더라도). 따옴표) :

EXEC(' 
    DECLARE @x TABLE(x VARCHAR(10)); 
    INSERT @x SELECT CHAR(39) + CHAR(39); 
    SELECT x FROM @x; 
'); 

동적 SQL 구성 할 때 일반적으로 연결하고 작은 따옴표의 추한 중첩을 피하기 위해 같은 것을 할 :

DECLARE @sql NVARCHAR(MAX) = N''; 

SET @sql = 'SELECT foo = $sq$bar$sq$;'; 

SET @sql = REPLACE(@sql, '$sq$', CHAR(39)); 

SELECT @sql; 

EXEC sp_executesql @sql; 

아니, 더 이상이 특정 사건을하지 않습니다 물론 읽을 수 있지만 동일한 문자열을 여러 번 참조하는 경우에는 다른 모든 연결 엉망을 처리하는 것보다 훨씬 큰 토큰 ($db$, $table$ 등)을 대체하는 것이 좋습니다. IMHO.

+0

REPLACE 기능을 잘 사용하면 동적 SQL을 사용하여 다음 모험시 고려해야 할 사항이 있습니다. 내가 이것을 대답으로 표시하지 않은 유일한 이유는 영리하면서도 당면한 질문에 대답하지 않기 때문입니다. – CheckRaise

+0

물론 그렇습니다. 그러나 질문을 "이 모든 작은 따옴표없이 어떻게합니까?"라고 해석하면 어떻게됩니까? 아마 그게 ... –

관련 문제