关于索引视图的设置问题

DBA_磊仔 2012-10-29 11:41:17
我公司的数据库未使用过,无法插入和更新数据。我查帮助说要使用索引视图,需要设置

set NUMERIC_ROUNDABORT Off
GO
set ANSI_NULLS on
GO
set ANSI_PADDING on
GO
set ANSI_WARNINGS on
GO
set ARITHABORT on
GO
set CONCAT_NULL_YIELDS_NULL on
GO
set QUOTED_IDENTIFIER ON
GO

但是我在数据库设置了之后,运行在更新表时仍然报错
我尝试重新创建各个存储过程中并设置以上的值,就不报错了

问:如何能够一次性完成所有的设置让数据库可以安全的使用索引视图、计算列索引之类的
在存储过程中一个个修改很麻烦,也不安全,如果漏了哪个没有设置,会导致错误
...全文
273 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称被占用了 2012-10-31
  • 打赏
  • 举报
回复
理论上,索引视图没有多少好处,这么麻烦,宁可用其他方法
汤姆克鲁斯 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

引用 10 楼 的回复:
你挺能折腾的嘛

你要将数据库设置为 QUOTED_IDENTIFIER On
存储过程都改成off?
是以前数据库和存储过程都是 OFF,我想用索引视图,非常的无奈
[/Quote]
貌似只能一个接一个的重置了

你可以查出来内容批量替换,然后导出成sql 文件,然后在执行这些文件。
  • 打赏
  • 举报
回复
这个估计很无奈了,看有没有其他的方法吧。例如说:重新建一张表,把视图中的数据放到这张表中,不过要自己去维护数据的一致性,也是一件很烦的事情
SQL77 2012-10-31
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
引用 9 楼 的回复:
引用 7 楼 的回复:
现在是这样,其他我在数据库设置,都没问题,主要是 SET QUOTED_IDENTIFIER
由于历史原因,数据库中的存储过程都设置了

存储过程上面的设置会覆盖数据库级别的设置
当我重新编译存储过程,就可以重新设置这个值
可是我有3000多个存储过程,我尝试用脚本导出所有存储过程,批量进行,可是有些存储过程过长被截断
而且有几十万行……
[/Quote]
如果你全都是索引视图.那佩服你的设计.

如果不是.并且没加密.那你就应该找出哪些是用到这些索引视图的文本.

并且修改这些文本.而不是修改所有的文本.
DBA_磊仔 2012-10-30
  • 打赏
  • 举报
回复
现在是这样,其他我在数据库设置,都没问题,主要是 SET QUOTED_IDENTIFIER
由于历史原因,数据库中的存储过程都设置了

存储过程上面的设置会覆盖数据库级别的设置
当我重新编译存储过程,就可以重新设置这个值
可是我有3000多个存储过程,我尝试用脚本导出所有存储过程,批量进行,可是有些存储过程过长被截断
而且有几十万行的生成脚本,我不敢直接运行。
而一个个重新编译,我做了一个早上才编译了200来个,这样效率很低
有无办法统一修改?
叶子 2012-10-30
  • 打赏
  • 举报
回复
可以看联机丛书中的例子:



USE Northwind
GO

--Set the options to support indexed views.
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING,ANSI_WARNINGS,CONCAT_NULL_YIELDS_NULL,ARITHABORT,QUOTED_IDENTIFIER,ANSI_NULLS ON
GO

--Create view.
CREATE VIEW V1
WITH SCHEMABINDING
AS
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Revenue, OrderDate, ProductID, COUNT_BIG(*) AS COUNT
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID
GROUP BY OrderDate, ProductID
GO

--Create index on the view.
CREATE UNIQUE CLUSTERED INDEX IV1 ON V1 (OrderDate, ProductID)
GO

--This query will use the above indexed view.
SELECT SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev, OrderDate, ProductID
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND ProductID in (2, 4, 25, 13, 7, 89, 22, 34)
AND OrderDate >= '05/01/1998'
GROUP BY OrderDate, ProductID
ORDER BY Rev DESC

--This query will use the above indexed view.
SELECT OrderDate, SUM(UnitPrice*Quantity*(1.00-Discount)) AS Rev
FROM dbo.[Order Details] od, dbo.Orders o
WHERE od.OrderID=o.OrderID AND DATEPART(mm,OrderDate)= 3
AND DATEPART(yy,OrderDate) = 1998
GROUP BY OrderDate
ORDER BY OrderDate ASC

DBA_磊仔 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
引用 7 楼 的回复:
现在是这样,其他我在数据库设置,都没问题,主要是 SET QUOTED_IDENTIFIER
由于历史原因,数据库中的存储过程都设置了

存储过程上面的设置会覆盖数据库级别的设置
当我重新编译存储过程,就可以重新设置这个值
可是我有3000多个存储过程,我尝试用脚本导出所有存储过程,批量进行,可是有些存储过程过长被截断
而且有几十万行的生成脚本,我不敢直接运行……
[/Quote]我不需要找哪有索引视图,因为都是我建的,我要的是我的索引视图不影响其他存储过程中出现的insert update delete
DBA_磊仔 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
你挺能折腾的嘛

你要将数据库设置为 QUOTED_IDENTIFIER On
存储过程都改成off?
[/Quote]是以前数据库和存储过程都是 OFF,我想用索引视图,非常的无奈

  • 打赏
  • 举报
回复
不懂帮顶 学习赠分
以学习为目的 2012-10-30
  • 打赏
  • 举报
回复
重新创建各个存储过程中并设置以上的值
really? 直接在数据量中设置重启下服务还会报错?
汤姆克鲁斯 2012-10-30
  • 打赏
  • 举报
回复
你挺能折腾的嘛

你要将数据库设置为 QUOTED_IDENTIFIER On
存储过程都改成off?
SQL77 2012-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
现在是这样,其他我在数据库设置,都没问题,主要是 SET QUOTED_IDENTIFIER
由于历史原因,数据库中的存储过程都设置了

存储过程上面的设置会覆盖数据库级别的设置
当我重新编译存储过程,就可以重新设置这个值
可是我有3000多个存储过程,我尝试用脚本导出所有存储过程,批量进行,可是有些存储过程过长被截断
而且有几十万行的生成脚本,我不敢直接运行。
而一个个重新编译,……
[/Quote]
SET QUOTED_IDENTIFIER 是在分析时进行设置的。在分析时进行设置意味着:SET 语句只要出现在批处理或存储过程中即生效,与代码执行实际上是否到达该点无关;并且 SET 语句在任何语句执行之前生效。

你设计了数据库的选项也徒劳。

你不是所有的都建立了索引视图吧?

首先你应该从索引sys.indexes找到有索引视图的。

再从sys.comments找到文本查找出来一一替换执行。
DBA_磊仔 2012-10-30
  • 打赏
  • 举报
回复
顶一下
  • 打赏
  • 举报
回复
但是我在数据库设置了之后,运行在更新表时仍然报错
我尝试重新创建各个存储过程中并设置以上的值,就不报错了
--》》
这个应该不用放到存储过程中吧,应该可以直接设置的
叶子 2012-10-29
  • 打赏
  • 举报
回复
在创建索引视图或对参与索引视图的表中的行进行操作时,有 7 个 SET 选项必须指派特定的值。SET 选项 ARITHABORT、CONCAT_NULL_YIELDS_NULL、QUOTED_IDENTIFIER、ANSI_NULLS、ANSI_PADDING 和 ANSI_WARNING 必须为 ON。SET 选项 NUMERIC_ROUNDABORT 必须为 OFF。

如果与上述设置有所不同,对索引视图所引用的任何表执行的数据修改语句 (INSERT、UPDATE、DELETE) 都将失败,SQL Server 会显示一条错误信息,列出所有违反设置要求的 SET 选项。
發糞塗牆 2012-10-29
  • 打赏
  • 举报
回复
这个....如果联机丛书和技术内幕都没说的话,那就有点困难了,明天翻翻资料去。继续加班

22,302

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧