Hoe ontsnap ik aan een enkel aanhalingsteken in SQL Server?

Ik probeer wat tekstgegevens te insertin een tabel in SQL Server 9.

De tekst bevat een enkel aanhalingsteken '.

Hoe voorkom ik daaraan?

Ik heb geprobeerd twee enkele aanhalingstekens te gebruiken, maar ik kreeg wat fouten.

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


Antwoord 1, autoriteit 100%

Enkele aanhalingstekens worden escaped door ze te verdubbelen, net zoals je ons in je voorbeeld hebt laten zien. De volgende SQL illustreert deze functionaliteit. Ik heb het getest op SQL Server 2008:

DECLARE @my_table TABLE (
    [value] VARCHAR(200)
)
INSERT INTO @my_table VALUES ('hi, my name''s tim.')
SELECT * FROM @my_table

Resultaten

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

Antwoord 2, autoriteit 5%

Als het ontsnappen van uw enkele aanhalingsteken met een ander enkel aanhalingsteken niet voor u werkt (zoals het niet deed voor een van mijn recente REPLACE()-query’s), kunt u SET QUOTED_IDENTIFIER OFFvoor uw vraag, dan SET QUOTED_IDENTIFIER ONna uw vraag.

Bijvoorbeeld

SET QUOTED_IDENTIFIER OFF;
UPDATE TABLE SET NAME = REPLACE(NAME, "'S", "S");
SET QUOTED_IDENTIFIER ON;
-- set OFF then ON again

Antwoord 3, autoriteit 4%

Wat dacht je van:

insert into my_table values('hi, my name' + char(39) + 's tim.')

Antwoord 4

Het verdubbelen van de quote had moeten werken, dus het is eigenaardig dat het bij jou niet werkte; een alternatief is echter het gebruik van dubbele aanhalingstekens, in plaats van enkele, rond de tekenreeks. D.w.z.

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


Antwoord 5

2 manieren om dit te omzeilen:


voor 'kun je het gewoon verdubbelen in de string, b.v.
select 'I''m happpy'— krijgt: I'm happy


Voor elk personage waar je niet zeker van bent: in de sql-server kun je de unicode van elke char krijgen door select unicode(':')(je behoudt het nummer)

Dus in dit geval kun je ook select 'I'+nchar(39)+'m happpy'


Antwoord 6

Velen van ons weten dat de populaire methode om aan enkele aanhalingstekens te ontsnappen is door ze eenvoudig te verdubbelen, zoals hieronder.

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

we gaan kijken naar andere alternatieve manieren om aan de enkele aanhalingstekens te ontsnappen.

1.UNICODE-tekens

39 is het UNICODE-teken van Single Quote. Dus we kunnen het gebruiken zoals hieronder.

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

2.QUOTED_IDENTIFIER

Een andere eenvoudige en beste alternatieve oplossing is om QUOTED_IDENTIFIER te gebruiken.
Als QUOTED_IDENTIFIER is ingesteld op UIT, kunnen de tekenreeksen tussen dubbele aanhalingstekens worden geplaatst.
In dit scenario hoeven we niet te ontsnappen aan enkele aanhalingstekens.
Dus deze manier zou erg handig zijn bij het gebruik van veel tekenreekswaarden met enkele aanhalingstekens.
Het zal zeer nuttig zijn bij het gebruik van zoveel regels INSERT/UPDATE-scripts waarbij kolomwaarden enkele aanhalingstekens hebben.

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

CONCLUSIE

De bovengenoemde methoden zijn van toepassing op zowel AZURE als On Premises.


Antwoord 7

Een ander ding om op te letten, is of het echt is opgeslagen als een klassieke ASCII ‘ (ASCII 27) of Unicode 2019 (die er hetzelfde uitziet, maar niet hetzelfde is).

Dit is niet erg voor inserts, maar het kan een wereld betekenen voor selecties en updates.
Als het de unicode-waarde is, zal het ontsnappen van de ‘ in een WHERE-component (bijv. waar blah = ‘Workers”s Comp’) terugkeren alsof de waarde waarnaar u zoekt er niet is als de ‘ in “Worker’s Comp” is eigenlijk de unicode-waarde.

Als uw clienttoepassing zowel vrije sleutel als invoer op basis van kopiëren en plakken ondersteunt, kan dit Unicode zijn in sommige rijen en ASCII in andere!

Een eenvoudige manier om dit te bevestigen is door een soort open query uit te voeren die de waarde die u zoekt terugbrengt, en die vervolgens te kopiëren en plakken in notepad++ of een andere unicode-ondersteunende editor.

Het afwijkende uiterlijk tussen de ascii-waarde en de unicode-waarde zou voor de ogen duidelijk moeten zijn, maar als je naar de anale kant leunt, wordt deze weergegeven als 27 (ascii) of 92 (unicode) in een hex-editor.


Antwoord 8

De volgende syntaxis zal SLECHTS ÉÉN aanhalingsteken ontsnappen:

SELECT ''''

Het resultaat is een enkele aanhalingsteken. Kan erg handig zijn voor het maken van dynamische SQL :).


Antwoord 9

De optie voor dubbele aanhalingstekens heeft me geholpen

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

Antwoord 10

Dit zou moeten werken

DECLARE @singleQuote CHAR 
SET @singleQuote =  CHAR(39)
insert into my_table values('hi, my name'+ @singleQuote +'s tim.')

Antwoord 11

Ik had hetzelfde probleem, maar het mijne was niet gebaseerd op statische gegevens in de SQL-code zelf, maar op waarden in de gegevens.

Deze code vermeldt alle kolomnamen en gegevenstypen in mijn database:

SELECT DISTINCT QUOTENAME(COLUMN_NAME),DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS

Maar sommige kolomnamen hebben een enkel aanhalingsteken ingesloten in de naam van de kolom!, zoals …

[MyTable].[LEOS'DATACOLUMN]

Om deze te verwerken, moest ik de REPLACE-functie gebruiken samen met de voorgestelde QUOTED_IDENTIFIER-instelling. Anders zou het een syntaxisfout zijn, wanneer de kolom wordt gebruikt in een dynamische SQL.

SET QUOTED_IDENTIFIER OFF;
    SET @sql = 'SELECT DISTINCT ''' + @TableName + ''',''' + REPLACE(@ColumnName,"'","''") + ...etc
SET QUOTED_IDENTIFIER ON;

Antwoord 12

De STRING_ESCAPEfunctie kan worden gebruikt op nieuwere versies van SQL Server


Antwoord 13

Voer gewoon een ‘ in voor iets dat moet worden ingevoegd. Het zal zijn als een escape-teken in sqlServer

Voorbeeld:
Als je een veld hebt als, Het gaat goed.
je kunt doen:
UPDATE my_table SET row =’Het gaat goed.’;


Antwoord 14

Dit zou moeten werken: gebruik een schuine streep naar achteren en plaats een dubbel aanhalingsteken

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

Other episodes