SQL SERVER2000视图索引问题,紧急求救

时间:2022-08-14 00:27:33
视图SQL语句如下:
SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE          VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT TOP 100 PERCENT dbo.T_PIO.PW_No, SUM(dbo.T_PIO.PIO_Qty) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y'
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse
ORDER BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

该视图对应索引SQL语句如下:
IF EXISTS (SELECT name FROM sysindexes WHERE name = 'IX_V_MorePQty')
DROP INDEX V_MorePQty.IX_V_MorePQty
CREATE UNIQUE CLUSTERED index  IX_V_MorePQty ON V_MorePQty(PW_No,TSW_WareHouse)
go

执行索引SQL语句后,报错如下:

服务器: 消息 1936,级别 16,状态 1,行 1
无法 index 视图 'RZ.dbo.V_MorePQty'。它包含一个或多个不允许使用的构造。

请高手帮忙看一下,多谢!!

27 个解决方案

#1


SQL SERVER2000视图索引问题,紧急求救这些你开了没?

#2


视图SQL语句执行时并没有报错,报错的是执行索引SQL语句时。
另外:将上面说的都开通,视图SQL与索引SQL前面都加上如下,一样报错
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 NUMERIC_ROUNDABORT OFF
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT TOP 100 PERCENT dbo.T_PIO.PW_No, SUM(dbo.T_PIO.PIO_Qty) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y'
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse
ORDER BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

一样报错同样信息。

#3


SQL SERVER2000视图索引问题,紧急求救
试图内排序没有意义,把top和order by去掉

#4


3楼的图是“不能出现在索引视图中的”

#5


首先感谢楼上两位,尤其是版主先生。感谢!!!
根据你们的建议,我修改视图SQL语句为如下:
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 NUMERIC_ROUNDABORT OFF
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT  dbo.T_PIO.PW_No, SUM(dbo.T_PIO.PIO_Qty) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

然后再执行同样的索引SQL语句,但是还是报错,只是这次错误信息如下:
服务器: 消息 8662,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。

#6


CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT  dbo.T_PIO.PW_No, SUM (isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

试试这个,另外。。。我怎么没看到你说的“第二个人?”

#7


多谢版主先生,刚才看错了,后来仔细一看,原来最热心帮我解答的就是版主你一个了。再次表示感谢!!

#8


可是,可是,你还得帮我看看,我照你说的改了视图SQL语句 SUM(isnull(dbo.T_PIO.PIO_Qty,0)) ,再执行索引SQL时,还是报错同样信息哦。
服务器: 消息 8662,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。 

#9


SELECT  dbo.T_PIO.PW_No, SUM(isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

执行一下这个,看看哪列有null值,或者些奇怪的值,另外回复引用一下

#10


SQL SERVER2000视图索引问题,紧急求救找到了这个不正常的

#11


即使我视图SQL语句的where 字句中加上条件 
SELECT  dbo.T_PIO.PW_No, SUM(isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null  and TSW_WareHouse<>'' and TSW_WareHouse is not nullGROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse
再执行索引SQL还是一样提示

无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。  

#12


版主先生,还在么?帮我看看啊,感谢!!

#13


再试试把这个放里面
SELECT  dbo.T_PIO.PW_No ,
        SUM(ISNULL(dbo.T_PIO.PIO_Qty, 0)) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
GROUP BY dbo.T_PIO.PW_No ,
        dbo.T_PIO.TSW_WareHouse

#14


或者先不创建索引,直接调视图看看结果

#15


调取视图看到的结果太多了有500多条,恕我不能一下全发给你。但是我尝试一摸一样的表,没有任何数据,先去建立视图,然后再执行索引SQL语句,还是一样的报错信息,所以我弱弱猜想一下,应该跟数据没有什么关系吧。是不是跟表字段属性有关呢?
我试着将视图的SQL语句改成你上面的,然后执行索引SQL语句时,错误信息又变成了这样:
服务器: 消息 8668,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为选定的视图列表包含一个非合计表达式。

#16


前面写错了,用这个试试:
SELECT  dbo.T_PIO.PW_No ,
        SUM(ISNULL(dbo.T_PIO.PIO_Qty, 0)) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
GROUP BY dbo.T_PIO.PW_No ,
      ISNULL(dbo.T_PIO.TSW_WareHouse,'')

#17


创建视图的SQL语句执行都没有问题,都可以执行成功,并可以直接查看结果。
现在就是在后面执行索引SQL语句时不停报错。

#18


视图中的表没有引用别的视图吧?另外列没有由别的比如getdate()这些创建的吧?

#19


查看求和的字段定义是否有加not null的限制?

#20


GROUP BY dbo.T_PIO.PW_No ,       ISNULL(dbo.T_PIO.TSW_WareHouse,'')

这样还是提示:无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。

表T_AC 与 T_PIO中没有调用其他视图,但是里面有getdate() 这样的列存在。
SQL中用到的三个列PW_NO,TSW_WareHouse,PIO_Qty 都没有getdate() 这样的属性

#21


说错了,表中的字段有日期属性的 datetime,但是没有字段在表中用到 getdate()  这样的默认值

#22


SELECT  dbo.T_PIO.PW_No ,
        SUM(dbo.T_PIO.PIO_Qty) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
       AND dbo.T_PIO.PIO_Qty IS NOT NULL 
GROUP BY dbo.T_PIO.PW_No ,
      ISNULL(dbo.T_PIO.TSW_WareHouse,'')


SQL SERVER2000视图索引问题,紧急求救这样呢?

#23


[PIO_Qty] [numeric](30, 3) NULL ,

加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
执行索引SQL提示:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。
SQL SERVER2000视图索引问题,紧急求救

#24


引用 23 楼 Tikyliu 的回复:
[PIO_Qty] [numeric](30, 3) NULL ,

加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
执行索引SQL提示:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。

不是这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL .
而是修改表结构的字段定义,修改该字段为not null.
alter table [表名] alter column [字段名] [数据类型] not null

#25


其实在你说改字段PIO_Qty属性为 NOT null之前我就试过了,不过为了对得起你的热心帮忙,我刚才又试了一遍。执行索引SQL错误信息如下:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。

#26


跟WHERE 子句里面加上 加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
报错信息是一摸一样的。

#27


有没QQ,我干脆把表结构也打包发给你算了。 SQL SERVER2000视图索引问题,紧急求救,帮忙就帮到底啊。好歹见个结果撒。

#1


SQL SERVER2000视图索引问题,紧急求救这些你开了没?

#2


视图SQL语句执行时并没有报错,报错的是执行索引SQL语句时。
另外:将上面说的都开通,视图SQL与索引SQL前面都加上如下,一样报错
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 NUMERIC_ROUNDABORT OFF
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT TOP 100 PERCENT dbo.T_PIO.PW_No, SUM(dbo.T_PIO.PIO_Qty) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y'
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse
ORDER BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

一样报错同样信息。

#3


SQL SERVER2000视图索引问题,紧急求救
试图内排序没有意义,把top和order by去掉

#4


3楼的图是“不能出现在索引视图中的”

#5


首先感谢楼上两位,尤其是版主先生。感谢!!!
根据你们的建议,我修改视图SQL语句为如下:
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 NUMERIC_ROUNDABORT OFF
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT  dbo.T_PIO.PW_No, SUM(dbo.T_PIO.PIO_Qty) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO

然后再执行同样的索引SQL语句,但是还是报错,只是这次错误信息如下:
服务器: 消息 8662,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。

#6


CREATE           VIEW dbo.V_MorePQty
WITH SCHEMABINDING
AS
SELECT  dbo.T_PIO.PW_No, SUM (isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

试试这个,另外。。。我怎么没看到你说的“第二个人?”

#7


多谢版主先生,刚才看错了,后来仔细一看,原来最热心帮我解答的就是版主你一个了。再次表示感谢!!

#8


可是,可是,你还得帮我看看,我照你说的改了视图SQL语句 SUM(isnull(dbo.T_PIO.PIO_Qty,0)) ,再执行索引SQL时,还是报错同样信息哦。
服务器: 消息 8662,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。 

#9


SELECT  dbo.T_PIO.PW_No, SUM(isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null
GROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse

执行一下这个,看看哪列有null值,或者些奇怪的值,另外回复引用一下

#10


SQL SERVER2000视图索引问题,紧急求救找到了这个不正常的

#11


即使我视图SQL语句的where 字句中加上条件 
SELECT  dbo.T_PIO.PW_No, SUM(isnull(dbo.T_PIO.PIO_Qty,0)) AS Qty,dbo.T_PIO.TSW_WareHouse
FROM dbo.T_PIO INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
where T_AC.AC_Show='Y' AND T_PIO.PIO_Show='Y' and PW_NO<>'' and PW_NO is not null  and TSW_WareHouse<>'' and TSW_WareHouse is not nullGROUP BY dbo.T_PIO.PW_No, dbo.T_PIO.TSW_WareHouse
再执行索引SQL还是一样提示

无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。  

#12


版主先生,还在么?帮我看看啊,感谢!!

#13


再试试把这个放里面
SELECT  dbo.T_PIO.PW_No ,
        SUM(ISNULL(dbo.T_PIO.PIO_Qty, 0)) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
GROUP BY dbo.T_PIO.PW_No ,
        dbo.T_PIO.TSW_WareHouse

#14


或者先不创建索引,直接调视图看看结果

#15


调取视图看到的结果太多了有500多条,恕我不能一下全发给你。但是我尝试一摸一样的表,没有任何数据,先去建立视图,然后再执行索引SQL语句,还是一样的报错信息,所以我弱弱猜想一下,应该跟数据没有什么关系吧。是不是跟表字段属性有关呢?
我试着将视图的SQL语句改成你上面的,然后执行索引SQL语句时,错误信息又变成了这样:
服务器: 消息 8668,级别 16,状态 1,行 1
无法在视图 'V_MorePQty' 上创建索引,因为选定的视图列表包含一个非合计表达式。

#16


前面写错了,用这个试试:
SELECT  dbo.T_PIO.PW_No ,
        SUM(ISNULL(dbo.T_PIO.PIO_Qty, 0)) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
GROUP BY dbo.T_PIO.PW_No ,
      ISNULL(dbo.T_PIO.TSW_WareHouse,'')

#17


创建视图的SQL语句执行都没有问题,都可以执行成功,并可以直接查看结果。
现在就是在后面执行索引SQL语句时不停报错。

#18


视图中的表没有引用别的视图吧?另外列没有由别的比如getdate()这些创建的吧?

#19


查看求和的字段定义是否有加not null的限制?

#20


GROUP BY dbo.T_PIO.PW_No ,       ISNULL(dbo.T_PIO.TSW_WareHouse,'')

这样还是提示:无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中包括未知值(可为空表达式的求和)。

表T_AC 与 T_PIO中没有调用其他视图,但是里面有getdate() 这样的列存在。
SQL中用到的三个列PW_NO,TSW_WareHouse,PIO_Qty 都没有getdate() 这样的属性

#21


说错了,表中的字段有日期属性的 datetime,但是没有字段在表中用到 getdate()  这样的默认值

#22


SELECT  dbo.T_PIO.PW_No ,
        SUM(dbo.T_PIO.PIO_Qty) AS Qty ,
        ISNULL(dbo.T_PIO.TSW_WareHouse,'')TSW_WareHouse
FROM    dbo.T_PIO
        INNER JOIN dbo.T_AC ON dbo.T_PIO.PIO_ACNo = dbo.T_AC.AC_ID
WHERE   T_AC.AC_Show = 'Y'
        AND T_PIO.PIO_Show = 'Y'
        AND PW_NO <> ''
        AND PW_NO IS NOT NULL
       AND dbo.T_PIO.PIO_Qty IS NOT NULL 
GROUP BY dbo.T_PIO.PW_No ,
      ISNULL(dbo.T_PIO.TSW_WareHouse,'')


SQL SERVER2000视图索引问题,紧急求救这样呢?

#23


[PIO_Qty] [numeric](30, 3) NULL ,

加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
执行索引SQL提示:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。
SQL SERVER2000视图索引问题,紧急求救

#24


引用 23 楼 Tikyliu 的回复:
[PIO_Qty] [numeric](30, 3) NULL ,

加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
执行索引SQL提示:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。

不是这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL .
而是修改表结构的字段定义,修改该字段为not null.
alter table [表名] alter column [字段名] [数据类型] not null

#25


其实在你说改字段PIO_Qty属性为 NOT null之前我就试过了,不过为了对得起你的热心帮忙,我刚才又试了一遍。执行索引SQL错误信息如下:
无法在视图 'V_MorePQty' 上创建索引,因为该视图的定义中不包括 count_big(*)。

#26


跟WHERE 子句里面加上 加上这句 AND dbo.T_PIO.PIO_Qty IS NOT NULL 
报错信息是一摸一样的。

#27


有没QQ,我干脆把表结构也打包发给你算了。 SQL SERVER2000视图索引问题,紧急求救,帮忙就帮到底啊。好歹见个结果撒。