我们刚刚遇到了一个问题,我们的一个存储的proc抛出了一个错误;
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'我通过修改存储的proc并将带引号的标识符设置为ON来修复它。问题是,我在CREATE PROCEDURE调用之前做了这件事。例如:
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相同。如果我说错了,请纠正我。我们的简单部署脚本如下所示;
@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引用的标识符
不能在运行时设置
在存储过程中“(我强调的是)。
我觉得这回答了我的第一个问题。
有没有人喜欢第二部分?
发布于 2011-09-20 18:34:38
我将以下命令保存到一个文本文件中,然后使用SQLCMD执行它:
SET QUOTED_IDENTIFIER ON
SET QUOTED_IDENTIFIER OFF正在签入SQL事件探查器,
在我的系统上使用以下连接选项进行连接:
-- network protocol: LPC
set quoted_identifier on
...但是,SQLCMD在连接时会发出以下命令:
SET QUOTED_IDENTIFIER OFF SET TEXTSIZE 4096然后它运行我的脚本。
因此,2)的答案是不运行脚本
与从SSMS执行不同(使用默认连接选项)。如果脚本需要
,然后,如果您打算以这种方式执行它,则需要在开始时显式地设置它。
发布于 2011-11-24 17:15:38
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值。
QUOTED IDENTIFIER ON/OFF:此选项指定使用双引号的设置。启用此选项时,将使用双引号作为SQL Server标识符(对象名)的一部分。这在标识符也是SQL Server保留字的情况下很有用。
发布于 2017-01-24 07:31:18
关于你的问题#1,原因在
使用SET语句时的注意事项
..。它声明:
除SET ANSI外,存储过程使用在执行时指定的SET设置执行
_
引用的空值和集合
_
标识符。存储过程指定SET ANSI
_
带引号的空值或集合
_
标识符使用在创建存储过程时指定的设置。如果在存储过程中使用,则忽略任何SET设置。
https://stackoverflow.com/questions/7481441
复制相似问题