2009-06-30 15 views
5

Próbuję uruchomić kwerendę w SQL 2008, wykonując:SQL Ucieczka „”

@query varchar(max) 

SET @query = 'SELECT * FROM Table WHERE [Name] = ' 'Karl' ' ' 

EXEC(@query) 

Problemem jest to, że z jakiegoś powodu apostrofy wokół 'Karl' nie dostać uciekł, czyli zapytanie wykonuje jako ...WHERE [Name] = Karl i zawiedzie.

Ktoś ma sugestię?

Dzięki

Karl

+0

To jest SQL Server 2008, prawda? Nie MySQL, PostgreSQL, SQLite ani żadnego innego wariantu SQL? – MiffTheFox

+3

Co widzisz, jeśli wydrukujesz ciąg @query? – Tetraneutron

Odpowiedz

0

zrobić jak ten SET @query = 'SELECT * FROM tabela WHERE [nazwa] = ''' 'Karl' '' ''

+0

to nie zadziała, chyba że Karl jest zapisany w bazie danych z pojedynczym cudzysłowem przed i po nim, jak na przykład "Karl", ponieważ powoduje, że rzeczywiste zapytanie to: WYBIERZ * Z tabeli WHERE [Nazwa] = '' Karl '' –

+0

thne dodaj jeszcze jedną wycenę pod koniec zrób to SET @query = 'SELECT * FROM Table WHERE [Nazwa] =' '' '' '' '' '' '' '' '' '' '' 'to tak – KuldipMCA

-1

prostu uciec apostrof za pomocą paska ucieczki \ tak 'SELECT * FROM tabela WHERE [nazwa] =' \ '\' Karl ''

Nadzieja pomaga

+3

który nie zadziała w t-sql serwera sql –

2

to działa na moim Maszyna z SQL Server Management Studio:

@query varchar(max) 

SET @query = 'SELECT * FROM Table WHERE [Name] = ''''''Karl''''''' 

EXEC(@query) 
+3

to nie zadziała, chyba że Karl jest zapisany w bazie danych z dwoma pojedynczymi cudzysłowami przed i po nim, jak "Karl", ponieważ powoduje to, że rzeczywiste zapytanie to: WYBIERZ * Z tabeli WHERE [Nazwa] = '' 'Karl '' ' –

3

Istnieje kilka sposobów, które można uciec danych znakowych w SQL Server, niektórzy nawet zalecają korzystanie z funkcji QUOTENAME().

Jeśli naprawdę chcesz rozwinąć solidne zrozumienie tego obszaru tematycznego, to polecam zapoznać się z tym, co doświadczeni twórcy SQL Server uważają za istotną lekturę w odniesieniu do różnych metod, które można zastosować do włączenia dynamicznego T -SQL do swojego kodowania.

The Curse and Blessings of Dynamic SQL

+0

To samo miejsce, do którego kieruję ludzi. – dverespey

1

Spróbuj:

DECLARE @query varchar(max) 

SET @query = 'SELECT * FROM Table WHERE [Name] = ''Karl''' 

PRINT 'when in doubt, print the query out: '+ISNULL(@query,'') 
EXEC(@query) 

Aby mieć jeden cytat pojawiają, trzeba mieć dwa sąsiadujące apostrofów. Uciec jeden cytat z jednego środki, na przykład:

PRINT ''''  --will print a one single quote 
PRINT '''''' --will print two single quotes 
PRINT 'can''t' --will print can't 
0

Podwójny singiel („”) cytat będzie działać jak jeden pojedynczy cudzysłów, gdy wewnątrz łańcucha dosłowne.

Czy próbowałeś używać zmiennej?

declare @karl_name varchar(10); 
set @karl_name = '''Karl'''; 

SELECT * FROM Table WHERE [Name] = @karl_name 
0

to działa:

create table #demo([Name] varchar(max)) 
insert into #demo([Name]) values('''Karl''') 
insert into #demo([Name]) values('Karl') 
declare @query varchar(max) 
set @query = 'SELECT * FROM #demo WHERE [Name] = ''''''Karl''''''' 
EXEC(@query) 

wyjściowa:

'Karl' 

Ale jeśli 'Karl' jest zmienna tekst, jest wysoce zalecane, aby użyć coś takiego zamiast:

declare @query nvarchar(max) 
declare @param varchar(max) 
set @param = N'''Karl''' 
set @query = N'SELECT * FROM #demo WHERE [Name] = @param' 
exec sp_executesql @query, N'@param varchar(max)', @param