La compréhension QUOTED_IDENTIFIER
Nous avons juste rencontré un problème avec un de nos stockées envisageable de lancer une erreur;
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
Je l'ai fixée par modifiying la procédure stockée et réglage de l'identificateur entre guillemets. La chose est, je l'ai fait avant la création de la PROCÉDURE d'appel. Par exemple;
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[InsertStuff]
J'aurais pensé que cela a nui à la création de la PROCÉDURE de déclaration, mais n'a pas affecté quelque chose à voir avec l'exécution de cette procédure.
Nos scripts sont déployés comme de chute et de créer des scripts et de l'exécuter via sqlcmd. Je viens de lire que ici (recherche par Exemple: l'Exécution de l'utilitaire SQLCMD) et ici que sqlcmd exécute avec identificateur entre guillemets hors. J'ai modifié le script pour inclure l'-je le changer pour voir si cela résout nos problèmes.
Mes questions sont ensuite;
1) le SET QUOTED_IDENTIFIER SUR la déclaration n'affectent que le DDL instruction CREATE PROCEDURE, ou faut-il également influer sur l'exécution de la procédure stockée? Mon test rapide indique ce dernier.
2) Comme valeur par défaut de ce paramètre est SUR, je suis en supposant que par moi réglage de la -I
le commutateur de ma sqlcmd requête n'aura pas d'effets négatifs. Pour toutes fins utiles, je suppose que c'est la même chose que de copier le contenu du script, puis les coller dans le gestionnaire de requête et de frapper exécuter. S'il vous plaît corrigez-moi si je me trompe à ce sujet. Notre simple script de déploiement est comme suit;
@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
Merci d'avance
Edit:
Il semble qu'il y a quelque plus d'info pour déterminer où le DÉFINIR des options pour les procs sont stockées, et l'on a accepté de répondre à cette donne quelques détails sur les règles générales concernant les génériques ordre de priorité qui s'applique à l'ENSEMBLE des options. Les commentaires sur cette affirment également qu';
" ...QUOTED_IDENTIFER et ANSI_NULLS sont capturées au moment de la création de la procédure."
"...ENSEMBLE IDENTIFICATEUR entre guillemets ne peut pas être réglé au moment de l'exécution à l'intérieur de la procédure stockée" (mon emphase).
Je sens que ça répond à ma première question.
Tout preneurs pour la deuxième partie?
OriginalL'auteur Mr Moose | 2011-09-20
Vous devez vous connecter pour publier un commentaire.
J'ai enregistré la commande suivante dans un fichier texte, puis à l'exécuter avec SQLCMD:
Vérification dans le générateur de profils SQL,
SQLCMD -i <filename>
se connecte avec les options de connexion suivantes sur mon système:cependant la commande suivante émise par l'utilitaire SQLCMD lorsqu'il se connecte:
et puis il exécute mon script.
Donc, la réponse à 2) n'est - exécution d'un script avec
SQLCMD -i
n'est pas la même que l'exécution de SSMS (avec la valeur par défaut des connexions options). Si un script nécessiteQUOTED_IDENTIFIER ON
, alors vous devez explicitement définie au début si vous allez exécuter de cette façon.Un orignal mon erreur. Dans ce cas, oui, ça devrait être la même que l'exécution via SSMS
OriginalL'auteur Ed Harper
À la recherche d'une compréhension de
QUOTED_IDENTIFIER
je vais poster une certaine compréhension, ici.Version courte
ANSI exigé que les guillemets autour des identificateurs (pas autour de chaînes de caractères). SQL Server pris en charge à la fois:
SQL Server à l'origine:
SELECT "Hello, world!"
--guillemetSELECT 'Hello, world!'
--apostropheCREATE TABLE [The world's most awful table name] ([Hello, world!] int)
SELECT [Hello, world!] FROM [The world's most awful table name]
ANSI (c'est à dire
SET QUOTED_IDENTIFIER ON
):SELECT "Hello, world!"
--guillemet n'est plus valide dans la norme ANSI autour de chaînes deSELECT 'Hello, world!'
--apostropheCREATE TABLE "The world's most awful table name" ("Hello, world!" int)
SELECT "Hello, world!" FROM "The world's most awful table name"
Les temps anciens,
À l'origine, SQL Server permis de l'utiliser guillemets (
"..."
) et apostrophes ('...'
) autour de chaînes de façon interchangeable (comme Javascript):SELECT "Hello, world!"
--guillemetSELECT 'Hello, world!'
--apostropheEt si vous voulais un nom de table, une vue, une procédure, une colonne, etc avec quelque chose qui serait autrement violer toutes les règles de nommage des objets, vous pouvez l'envelopper dans crochets (
[
,]
):Et qui ont tous travaillé, et fait sens.
Puis vint ANSI
Puis ANSI est venu et avait d'autres idées:
"..."
)'...'
) pour les chaînesCe qui signifie que si vous voulez "citation" un funky colonne ou le nom de la table, vous devez utiliser des guillemets:
Si vous saviez SQL Server, vous saviez que guillemets ont déjà été utilisés pour représenter des chaînes de caractères. Si vous aveuglément essayé de l'exécuter ANSI-SQL comme si c'était T-SQL: c'est un non-sens, et SQL Server vous l'a dit:
, Vous devez vous inscrire à la nouvelle norme ANSI comportement
Donc, Microsoft a ajouté une fonctionnalité pour vous permettre de l'opt-in à l'ANSI saveur de SQL.
Original
SET QUOTED_IDENTIFIER ON
SQL Server vous permettant de continuer à utiliser
[square brackets]
, plutôt que de vous forcer à utiliser"quotatio marks"
. Mais avec QUOTED_IDENTIFIER on, vous ne peut pas utilisation"double quote quotation mark around strings"
, vous devez utiliser uniquement des'the single quote apostrophe'
.OriginalL'auteur Ian Boyd
Cette option spécifie la valeur de la norme ANSI NULL comparaisons. Quand c'est sur, toute requête qui permet de comparer une valeur avec une valeur null renvoie 0. Lorsqu'elle est désactivée, la requête qui permet de comparer une valeur avec une valeur null renvoie une valeur null.
Cette option spécifie la valeur de l'utilisation des guillemets. Quand c'est sur, guillemet double est utilisé dans le cadre de l'identificateur SQL Server (nom de l'objet). Cela peut être utile dans les situations où les identificateurs sont également réservés SQL Server mots.
OriginalL'auteur gngolakia
Au sujet de votre question #1, la raison est indiqué dans Considérations Lors de l'Utilisation de l'instruction SET. Il déclare:
OriginalL'auteur Guillermo Gutiérrez