我们刚刚遇到了一个问题,其中一个存储过程抛出了错误;
SELECT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
我通过修改存储过程并将引号标识符设置为ON来解决了这个问题。问题是,在CREATE PROCEDURE调用之前,我就已经做了这个操作。例如:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[InsertStuff]
我会认为这会影响CREATE PROCEDURE语句,但不会影响该过程的执行。
我们的脚本都是作为删除和创建脚本部署并通过sqlcmd运行的。我刚刚读到这里(搜索示例:执行SQLCMD)和这里,说明sqlcmd以关闭引号标识符的方式执行。我已经更改了我们的脚本,包括-I开关,以查看是否可以解决我们的问题。
我的问题是:
1)SET QUOTED_IDENTIFIER ON语句只影响DDL CREATE PROCEDURE语句,还是也影响存储过程的执行?我的快速测试表明是后者。
2)由于此开关的默认值为ON,我假设设置我的sqlcmd查询的-I
开关不会产生负面影响。就所有目的而言,我将假设它与复制脚本内容,然后将其粘贴到查询管理器中并点击执行相同。如果我对此有误,请纠正我。我们的简单部署脚本如下:
@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
提前感谢。
编辑:
似乎还有一些进一步的信息需要确定存储过程的SET选项存储在哪里,而对此的接受答案提供了一些关于通用优先顺序规则的细节,适用于SET选项。对此的评论也指出:;
"...只有QUOTED_IDENTIFER和ANSI_NULLS设置在过程创建时被捕获。""...SET QUOTED IDENTIFIER 不能在存储过程内运行时设置"(我强调)。
我觉得这回答了我的第一个问题。
谁能接下来回答第二个问题呢?
SELECT "Hello, world!"
来说明列名和字符串字面量是很混淆的。最好将SELECT "Hello, world!" FROM "The world's most awful table name"
更改为SELECT "The world's most awful column name" FROM "The world's most awful table name"
。 - CaltorFROM
子句中更改它,而不是在最后4个示例中实际上是字符串文字的情况下更改它。 - Caltor