Verständnis QUOTED_IDENTIFIER
Wir lief in ein problem mit einem unserer stored procs auslösen eines Fehlers;
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
Ich es behoben, indem Sie die gespeicherte Prozedur und die Einstellung der quoted identifier AUF on. Die Sache ist die, ich habe diese vor der CREATE PROCEDURE-call. Zum Beispiel;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[InsertStuff]
Hätte ich gedacht, dass dies beeinflusste die CREATE PROCEDURE-Anweisung, aber würde nicht betroffen haben nichts zu tun mit der Ausführung der Prozedur.
Unseren Skripten sind alle bereitgestellt, die als drop-und create-Skripten und laufen über sqlcmd. Ich habe gerade gelesen, dass hier (Suche Beispiel: Ausführen von SQLCMD) und hier, dass sqlcmd ausgeführt, mit Bezeichner aus. Ich habe mich verändert unser Skript so, dass es den -I-Schalter, um zu sehen, ob das behebt unsere Probleme.
Meine Fragen sind dann;
1) Hat die SET QUOTED_IDENTIFIER ON-Anweisung wirkt sich nur auf die DDL-Anweisung CREATE PROCEDURE oder kommt es auch auf die Ausführung der stored proc auch? Mein kurzer test zeigt die letzteren.
2) Als Standardeinstellung für diesen Schalter ist AN, ich bin davon ausgegangen, dass durch mich die Einstellung der -I
Schalter meiner sqlcmd-query haben keine negativen Auswirkungen. Für alle Absichten und Zwecke, ich nehme an, es ist das gleiche wie das kopieren Sie den Inhalt des Skripts und dann fügen Sie Sie in den Abfrage-manager, und drücken Sie execute. Bitte korrigieren Sie mich wenn ich bin falsch über diese. Unsere einfache Bereitstellung-Skript ist wie folgt;
@echo off
SET dbodir=../Schema Objects/Schemas/dbo/Programmability/Stored Procedures/
SET tpmdir=../Schema Objects/Schemas/TPM/Programmability/Stored Procedures/
echo --- Starting dbo schema
for %%f in ("%dbodir%*.sql") do (echo Running %%f.... && @sqlcmd -I -U %1 -P %2 -S %3 -d %4 -i "%dbodir%%%f")
echo --- Completed dbo schema
echo --- Starting TPM schema
for %%g in ("%tpmdir%*.sql") do (echo Running %%g.... && @sqlcmd -I -U %1 -P %2 -S %3 -d %4 -i "%tpmdir%%%g")
echo --- Completed TPM schema
pause
Vielen Dank im Voraus
Edit:
Es scheint, als gäbe es einige weitere Infos, um zu bestimmen, wo die SET-Optionen für gespeicherte Prozeduren gespeichert sind, und die akzeptierte Antwort auf diese bietet einige details, auf die Allgemeinen Regeln über generische Reihenfolge der Priorität, das gilt für die SET-Optionen. Die Kommentare zu diesem Zustand auch, dass;
" ...Nur QUOTED_IDENTIFER und ANSI_NULLS-Einstellungen erfasst werden, in Verfahren die Schöpfung der Zeit."
"...SETZEN Sie den BEZEICHNER in Anführungszeichen kann nicht zur Laufzeit festgelegt werden innerhalb der stored proc" (meine Betonung).
Ich das Gefühl, dass beantwortet meine erste Frage.
Irgendwelche Abnehmer für den zweiten Teil?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Rettete ich den folgenden Befehl, um eine Textdatei, danach wird es mit SQLCMD:
Überprüfung in SQL profiler
SQLCMD -i <filename>
verbindet sich mit den folgenden Anschlussmöglichkeiten auf meinem system:jedoch der folgende Befehl, der von SQLCMD, wenn es eine Verbindung herstellt:
und dann läuft mein script.
Also, die Antwort auf 2) nicht - ausführen eines Skripts mit
SQLCMD -i
ist nicht das gleiche wie die Ausführung von SSMS (mit den Standard-Anschlüssen Optionen). Wenn ein Skript es erfordertQUOTED_IDENTIFIER ON
, dann müssen Sie explizit festlegen, von Anfang an, wenn du gehst zu führen, es auf diese Weise.Suchen für ein Verständnis von
QUOTED_IDENTIFIER
werde ich einige verstehen hier.Kurze version
ANSI gefordert, die Anführungszeichen werden verwendet, um Kennungen (nicht um strings). SQL-Server unterstützt sowohl:
SQL Server Zitat:
SELECT "Hello, world!"
--AnführungszeichenSELECT 'Hello, world!'
--ApostrophCREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
ANSI (d.h.
SET QUOTED_IDENTIFIER ON
):SELECT "Hello, world!"
--Anführungszeichen nicht mehr gültig, in ANSI um stringsSELECT 'Hello, world!'
--ApostrophCREATE TABLE "The world's most awful table name" ("Hello, world!" int)
SELECT "Hello, world!" FROM "The world's most awful table name"
Alten Zeiten
Ursprünglich, SQL-Server erlaubt Ihnen die Nutzung Anführungszeichen (
"..."
) und Apostrophe ('...'
) um strings austauschbar (wie Javascript funktioniert):SELECT "Hello, world!"
--AnführungszeichenSELECT 'Hello, world!'
--ApostrophUnd wenn Sie wollten, ein name der Tabelle, Ansicht, Prozedur, Spalte usw. mit etwas, das sonst verstößt gegen alle Regeln für die Benennung von Objekten, könnten Sie wickeln Sie es in eckigen Klammern (
[
,]
):Ist und dass alles funktioniert und Sinn gemacht.
Dann kam ANSI
Dann ANSI kam und hatte andere Ideen:
"..."
)'...'
) für StreicherWas bedeutet, dass, wenn Sie wollte "Zitat" funky Spalte oder Tabelle Namen müssen Sie Anführungszeichen verwenden:
Wenn Sie wusste, SQL-Server, wüsstest du, dass Anführungszeichen die bereits verwendet wurden, um strings. Wenn man blind versucht auszuführen, dass ANSI-SQL, als wäre es T-SQL: es ist Unsinn, und SQL Server-told you so:
Müssen Sie das opt-in zu der neuen ANSI-Verhalten
So fügte Microsoft eine Funktion zum lassen Sie opt-in, um den ANSI-Geschmack von SQL.
Original
SET QUOTED_IDENTIFIER ON
SQL-Server kann man noch verwenden
[square brackets]
, anstatt zwingen, Sie zu verwenden"quotatio marks"
. Aber mit QUOTED_IDENTIFIER ON, Sie nicht verwenden"double quote quotation mark around strings"
müssen Sie nur nutzen'the single quote apostrophe'
.SELECT "Hello, world!"
zu veranschaulichen, die Spalte name und string-literal. Es ist vielleicht das beste, wenn Sie ändernSELECT "Hello, world!" FROM "The world's most awful table name"
zuSELECT "The world's most awful column name" FROM "The world's most awful table name"
The world's most awful column name
ist, den Namen einer Spalte.FROM
- Klausel. Nicht dort, wo es tatsächlich ein string-literal wie in den letzten 4 Beispiele.Diese option legt die Einstellung für ANSI-NULL-Vergleiche. Wenn dies eingeschaltet ist, jede Abfrage, vergleicht einen Wert mit einer null gibt eine 0 zurück. Wenn deaktiviert, wird jede Abfrage, vergleicht einen Wert mit einer null einen null-Wert.
Dieser Option können Sie die Einstellung für die Verwendung von Anführungszeichen. Wenn dies eingeschaltet ist, werden doppelte Anführungszeichen verwendet, als Teil der SQL Server-Bezeichner (Objektnamen). Dies kann nützlich sein in Situationen, in denen die Bezeichner sind auch SQL-Server reservierte Wörter.
Über Ihre Frage #1, der Grund ist angegeben in Überlegungen zum Verwenden der SET-Anweisungen. Es besagt: