首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解QUOTED_IDENTIFIER

了解QUOTED_IDENTIFIER
EN

Stack Overflow用户
提问于 2011-09-20 15:18:06
回答 3查看 15.4K关注 0票数 12

我们刚刚遇到了一个问题,我们的一个存储的proc抛出了一个错误;

代码语言:javascript
复制
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'

我通过修改存储的proc并将带引号的标识符设置为ON来修复它。问题是,我在CREATE PROCEDURE调用之前做了这件事。例如:

代码语言:javascript
复制
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[InsertStuff]

我本以为这会影响CREATE procedure语句,但不会影响该过程的执行。

我们的脚本都部署为drop和create脚本,并通过sqlcmd运行。我刚读过

此处(搜索示例:执行SQLCMD)

这里

该sqlcmd使用

引号标识符关闭

..。我已经更改了我们的脚本以包含-I开关,看看这是否能解决我们的问题。

我的问题是;

1)集合是否被引用

_

IDENTIFIER ON语句只影响DDL CREATE PROCEDURE语句,还是也会影响存储过程的执行?我的快速测试表明是后者。

2)由于此开关的缺省值为ON,因此我假设通过设置

切换我的sqlcmd查询将不会有任何负面影响。对于所有意图和目的,我将假设它与复制脚本内容,然后将其粘贴到查询管理器中并单击execute相同。如果我说错了,请纠正我。我们的简单部署脚本如下所示;

代码语言:javascript
复制
@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

提前感谢

编辑:

看起来好像有一些

更多信息

为了确定存储过程的集合选项的存储位置,以及对此问题的公认答案,提供了有关适用于集合选项的一般优先顺序的一般规则的一些详细信息。关于这一点的评论还表明;

“...Only引用

_

IDENTIFER和ANSI

_

NULLS设置是在过程创建时捕获的。“"...SET引用的标识符

不能在运行时设置

在存储过程中“(我强调的是)。

我觉得这回答了我的第一个问题。

有没有人喜欢第二部分?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-09-20 18:34:38

我将以下命令保存到一个文本文件中,然后使用SQLCMD执行它:

代码语言:javascript
复制
SET QUOTED_IDENTIFIER ON
SET QUOTED_IDENTIFIER OFF

正在签入SQL事件探查器,

在我的系统上使用以下连接选项进行连接:

代码语言:javascript
复制
-- network protocol: LPC
set quoted_identifier on
...

但是,SQLCMD在连接时会发出以下命令:

代码语言:javascript
复制
SET QUOTED_IDENTIFIER OFF SET TEXTSIZE 4096

然后它运行我的脚本。

因此,2)的答案是不运行脚本

与从SSMS执行不同(使用默认连接选项)。如果脚本需要

,然后,如果您打算以这种方式执行它,则需要在开始时显式地设置它。

票数 2
EN

Stack Overflow用户

发布于 2011-11-24 17:15:38

代码语言:javascript
复制
SET QUOTED_IDENTIFIER ON

GO

SET ANSI_NULLS ON

GO
--SQL PROCEDURE, SQL FUNCTIONS, SQL OBJECTGO

SET QUOTED_IDENTIFIER OFF

GO

SET ANSI_NULLS ON

GO

ANSI NULL ON/OFF:

此选项指定ANSI NULL比较的设置。当此选项为on时,任何将值与null进行比较的查询都将返回0。如果设置为off,则任何将值与null进行比较的查询都将返回NULL值。

代码语言:javascript
复制
QUOTED IDENTIFIER ON/OFF:

此选项指定使用双引号的设置。启用此选项时,将使用双引号作为SQL Server标识符(对象名)的一部分。这在标识符也是SQL Server保留字的情况下很有用。

票数 0
EN

Stack Overflow用户

发布于 2017-01-24 07:31:18

关于你的问题#1,原因在

使用SET语句时的注意事项

..。它声明:

除SET ANSI外,存储过程使用在执行时指定的SET设置执行

_

引用的空值和集合

_

标识符。存储过程指定SET ANSI

_

带引号的空值或集合

_

标识符使用在创建存储过程时指定的设置。如果在存储过程中使用,则忽略任何SET设置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7481441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档