SQL Server에서 작은 따옴표를 이스케이프 처리하려면 어떻게해야합니까?


956

9의 insert텍스트 데이터를 테이블에 넣으려고합니다 SQL Server.

텍스트는 작은 따옴표 ( ')를 포함합니다.

나는 그것을 어떻게 탈출합니까?

두 개의 작은 따옴표를 사용해 보았지만 약간의 오류가 발생했습니다.

예. insert into my_table values('hi, my name''s tim.');


30
"오류가 발생했습니다"-이 오류는 무엇입니까?
llamaoo7

그렇습니다 .MSSQL에 작은 따옴표를 삽입하는 올바른 방법은 따옴표를 두 배로 늘리는 것입니다. 당신이 우리에게 보여준 예는 작동해야합니다. 어떤 언어로 SQL 쿼리를 작성하는 방법? 아니면 SQL Server Management Studio에 있습니까?
MaxiWheat

답변:


1388

작은 따옴표는 예제에서 우리가 보여 주듯이 따옴표를 두 배로 늘려서 탈출 합니다. 다음 SQL은이 기능을 보여줍니다. SQL Server 2008에서 테스트했습니다.

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)

INSERT INTO @my_table VALUES ('hi, my name''s tim.')

SELECT * FROM @my_table

결과

value
==================
hi, my name's tim.

16
내 문제를 해결하기 위해 잘못된 곳을 찾고있었습니다. 결국 캐릭터 이스케이프 문제가 아니 었습니다. 내 문제는 데이터 길이가 한계를 초과했다는 것입니다. 작은 따옴표를 두 번 사용하는 것이 캐릭터를 이스케이프 처리하는 올바른 방법이라는 것을 안심시켜 주셔서 감사합니다.
tim_wonil

따라서 10k 단어가 포함 된 텍스트가 있으면 모든 텍스트를 바꿔야합니까?
Vinicius Lima

3
@ViniciusLima : 짧은 대답은 '예'입니다. 물론 데이터 저장에 사용할 기술에 따라 변경 될 수 있습니다. 당신이 ORM을 사용한다면 그것은 당신을 위해 그것을 할 것입니다. SQL 명령을 수동으로 작성하는 경우 언어의 "준비된 명령문"기능을 사용하려고합니다. Management Studio에서 작업을 수행하는 경우 교체를 수행해야합니다.
Cᴏʀʏ

1
즉, 하나의 작은 따옴표 두 개. [ ''] => [ ']
Ujjwal Singh

67

작은 따옴표를 다른 작은 따옴표로 이스케이프 처리하지 않으면 (최근의 REPLACE()쿼리 중 하나와 같지 않은 것처럼 ) SET QUOTED_IDENTIFIER OFF쿼리 전에 사용할 SET QUOTED_IDENTIFIER ON수 있습니다.

예를 들어

SET QUOTED_IDENTIFIER OFF;

UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");

SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

2
일반적으로 이중 접근 방식을 사용하지만 여러 서버와 데이터베이스에서 실행되는 동적 SQL을 생성하는 경우이 솔루션은 저에게 효과적이지만 두 배의 경우에는 특정 사례가 아닙니다. 감사합니다!
Richard Moss

계산 열에서 뷰 및 인덱스를 참조 할 때주의하십시오. 그렇지 않으면 오류가 발생할 수 있습니다. stackoverflow.com/questions/9235527/…
datagod

@RichardMoss, +1 당신과 같은 시나리오. 이중 솔루션은 초기 솔루션입니다. 여러 서버에 동적 SQL과 같은 복잡한 쿼리의 경우,이 의지 작업은 두 배로 접근하지 않을 수 있습니다
에드가 앨런 베이런


17

견적이 배가 된 것은 효과가 있었으므로, 그것은 당신에게 효과가 없었습니다. 그러나 대안은 문자열 주위에 작은 따옴표 대신 큰 따옴표를 사용하는 것입니다. 즉,

insert into my_table values("hi, my name's tim.");


4
텍스트에 작은 따옴표와 큰 따옴표가 모두 포함되어 있으면 어떻게됩니까? 또한 큰 따옴표는 필드 이름 전용으로 예약되어 있지 않습니까?
Lajos Meszaros

11

이 문제를 해결하는 두 가지 방법 :


에 대한 '당신이 단순히 문자열을 두배로 할 수있다, 예를 들면 select 'I''m happpy'- 얻을 것이다 :I'm happy


어떤 문자에 대해서도 확실하지 않습니다 .SQL 서버에서는 다음과 같이 문자의 유니 코드를 얻을 수 있습니다 select unicode(':')(숫자 유지)

이 경우에도 select 'I'+nchar(39)+'m happpy'


6

또한주의해야 할 또 다른 사항은 실제로 클래식 ASCII '(ASCII 27) 또는 유니 코드 2019 (유사하지만 동일하지는 않음)로 저장되는지 여부입니다.

이것은 인서트에 큰 문제는 아니지만 선택과 업데이트에 대한 세계를 의미 할 수 있습니다.
유니 코드 값인 경우 WHERE 절에서 '를 이스케이프 처리하면 (예 : blah ='Workers 's Comp ') "Worker 's Comp"의'가 실제로 유니 코드 값. 이를 확인하는 간단한 방법은 검색중인 값을 다시 가져온 다음 메모장 ++ 또는 다른 유니 코드 지원 편집기에 복사하여 붙여 넣는 일종의 개방형 쿼리를 수행하는 것입니다.

클라이언트 응용 프로그램이 프리 키를 지원하고 복사 및 붙여 넣기 기반 입력을 지원하는 경우 일부 행은 유니 코드이고 다른 행은 ASCII 일 수 있습니다!



ascii 값과 유니 코드 값 사이의 다른 모양은 눈에 분명해야하지만 항문을 향해 기울이면 16 진 편집기에서 27 (ascii) 또는 92 (unicode)로 표시됩니다.


4

우리 중 많은 사람들이 작은 따옴표를 이스케이프 처리하는 방법이 아래처럼 쉽게 두 배로 늘리는 것임을 알고 있습니다.

PRINT 'It''s me, Arul.';

작은 따옴표 방법을 두 배로

작은 따옴표를 이스케이프 처리하는 다른 대체 방법을 살펴 보겠습니다.

1. 유니 코드 문자

39는 작은 따옴표의 유니 코드 문자입니다. 아래와 같이 사용할 수 있습니다.

PRINT 'Hi,it'+CHAR(39)+'s Arul.';
PRINT 'Helo,it'+NCHAR(39)+'s Arul.';

유니 코드 문자

2.QUOTED_IDENTIFIER

또 다른 간단하고 최상의 대체 솔루션은 QUOTED_IDENTIFIER를 사용하는 것입니다. QUOTED_IDENTIFIER가 OFF로 설정되면 문자열을 큰 따옴표로 묶을 수 있습니다. 이 시나리오에서는 작은 따옴표를 이스케이프 처리 할 필요가 없습니다. 따라서이 방법은 작은 따옴표로 많은 문자열 값을 사용하는 동안 매우 유용합니다. 열 값에 작은 따옴표가있는 INSERT / UPDATE 스크립트를 너무 많이 사용하면 매우 유용합니다.

SET QUOTED_IDENTIFIER OFF;
PRINT "It's Arul."
SET QUOTED_IDENTIFIER ON;

QUOTE_IDENTIFIER

결론

위에서 언급 한 방법은 AZURE 및 온 프레미스 모두에 적용 할 수 있습니다.


1

다음 구문은 따옴표 하나만 이스케이프합니다.

SELECT ''''

결과는 작은 따옴표입니다. 동적 SQL을 만드는 데 매우 도움이 될 수 있습니다. :). 여기에 이미지 설명을 입력하십시오


0

이 작동합니다

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)

insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

0

삽입하기 전에 '를 삽입하십시오. sqlServer의 이스케이프 문자와 같습니다.

예 : 필드가 있으면 괜찮습니다 . 당신은 할 수 있습니다 : UPDATE my_table SET row = 'I''m fine.';


그것이 OP가 한 일과 정확히 일치하지 않습니까? 최고의 답변과 이미 동일합니까? 아마도 다른 오류 원인이 있었을 것입니다.
Michael MacAskill 2016 년

-2

작동해야합니다 : 백 슬래시를 사용하고 큰 따옴표를 넣으십시오.

"UPDATE my_table SET row =\"hi, my name's tim.\";

무슨 소리 야? PRINT \"hi, my name's tim.\";SSMS에서 작동 한다고 말하고 있습니까? 그것은 전혀 작동하지 않으며 아무도 그것이 작동한다고 말한 적이 없습니다.
모하마드 무사 비

절대 작동하지 않습니다.
Santosh Jadi
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.