执行proc1时,出现如下错误:
更新失败,因为以下 SET 选项的设置不正确:“ANSI_WARNINGS”。验证 SET 选项是否正确用于计算列上的索引视图和/或索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作。
我知道这是因为我在客户表上有一个过滤索引,这需要 SET ANSI_WARNINGS ON。
甚至我们需要一些 ANSI 选项,在创建过滤索引和存储过程时需要注意这些选项。这些事情我都处理过了。
我已经通过在 proc1 中设置 ansi_warning 解决了这个问题,我认为这是理想的解决方案。
但我的问题是,即使在 proc2 中设置了所有必需的 ANSI 选项之后,为什么我会收到此错误?任何的想法?
下面是我的示例代码:
create Customers
(
id int,
name varchar(100),
[Stats] BIT NOT NULL DEFAULT 1,
)
go
CREATE NONCLUSTERED INDEX [IX_Customers_Stats]
ON [dbo].[Customers]([Stats])
WHERE [Stats] = 0
go
CREATE PROC proc1
as
BEGIN
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
....
...
.. some code .....
....
...
EXEC proc2 @customerId
END
go
createPROCEDURE [dbo].[proc2 ]
@customerId …
Run Code Online (Sandbox Code Playgroud) 我正在使用循环优化包含一些业务逻辑的 SP。我已经删除了循环并将这些代码段转换为一些简单的插入/更新语句。
现在我必须进行基准测试并在执行时间和逻辑/物理读取方面比较新旧代码。
我的问题是由于旧代码中的循环,我如何确定逻辑/物理读取的总数是多少。因为在 SSMS 中,我可以看到数以千计的 IO stats 语句,例如:
“表‘员工’。扫描计数 1,逻辑读取 3,物理读取 0,预读读取 0,lob 逻辑读取 43,lob 物理读取 0,lob 预读读取 0。”
在我的代码中,我使用select * into #tempTable
. 临时表包含大量记录,我需要在代码中多次从中检索数据,因此我在其上创建了聚集索引。但不知何故,我没有按照创建的索引以正确的顺序获取数据。
我知道我可以简单地通过放置order by
子句来做到这一点,但我的问题是为什么即使我强制优化器使用特定索引,我也没有以正确的顺序获取数据?
下面是我的示例代码:
----------- Sample code ----------------------------
;with CTE1
as (
select col1
,col2
,-- - -- - - from table1
union
select col1
,col2
,-- - -- - - from table2
-- few more tables in union --
)
, CTE2
as (
select *
,RowNumber = RowNumber()
over (order by case
when @sortOrder = 0
then case
when @sortColumn = 'Date'
then [tdate]......some more dynamic order by conditions..........
end …
Run Code Online (Sandbox Code Playgroud)