我的团队成员有一些奇怪的行为,可以在开发环境和系统测试环境MS sql数据库中重新创建.
如果他直接运行这个查询,它返回517行,这是正确和预期的结果:
SELECT p.package_id,la.CODE_KID FROM package p with (nolock),Strength s with (nolock),ProductCODE la with (nolock),CODE a with (nolock) where p.Strength_ID = s.Strength_ID and la.Product_ID = s.Product_ID AND la.CODE_KID = a.CODE_ID except select p.package_ID,p.CODE_KID from package p
但是,如果他在一个视图中放置相同的查询,则错误地返回311行 – 比直接运行查询少206行.
如果我们为直接查询和视图查询运行查询分析器,我们看到两个查询计划是完全不同的,但我们不明白为什么.
他还试图将查询转储到临时表中:
insert into MyDB.CODE_PACKAGE SELECT p.package_id,la.CODE_KID FROM package p with (nolock),CODE a with (nolock) where p.Strength_ID = s.Strength_ID and la.Product_ID = s.Product_ID AND la.CODE_KID = a.CODE_ID except select p.package_ID,p.CODE_KID from package p
,它正确创建了一个具有517行的表.但是,如果他将相同的sql放在存储过程中,它会错误地返回311行.
有什么想法可以导致这个奇怪的行为?
他也尝试了以下没有任何成功:
>删除nolock
>设置事务隔离级别以读取未提交
更新
我不知道SSMS向导或模板是否用于创建视图,但如果我选择“脚本视图为 – > CREATE to – >新建查询编辑器窗口”,那么这是输出:
USE [TestUtv] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE view [MyDBviews].[CODE_PACKAGE] as SELECT p.package_id,p.CODE_KID from package p GO
这里是使用的表之一,不幸的是,数据库是相当巨大的数百个表和视图,所以我不能在这里发布所有内容.
CREATE TABLE [dbo].[Package]( [Package_ID] [uniqueidentifier] NOT NULL,[Multiple] [int] NULL,[Multiple2] [int] NULL,[OutProdnum] [varchar](6) NULL,[OutProdnumDate] [datetime] NULL,[zzzPackage_KID] [uniqueidentifier] NULL,[Strength_ID] [uniqueidentifier] NULL,[Indi] [varchar](4096) NULL,[CreatedDate] [datetime] NULL,[CreatedBy] [varchar](255) NULL,[LastChangedDate] [datetime] NULL,[LastChangedBy] [varchar](255) NULL,[CODE_KID] [uniqueidentifier] NULL,[MarkDate] [datetime] NULL,[Amount] [int] NULL,[KIPackage_ID] [uniqueidentifier] NULL,[xyz] [bit] NULL,[Ean] [varchar](255) NULL,[D_ID] [uniqueidentifier] NULL,[abc_ID] [uniqueidentifier] NULL,[DDD] [decimal](18,4) NULL,[era_KID] [uniqueidentifier] NULL,[uuu] [decimal](18,[ueer_KID] [uniqueidentifier] NULL,[abcIdString] [varchar](4095) NULL,[ExternalId] [varchar](255) NULL,[Dpack_KID] [uniqueidentifier] NULL,[tttpacks_KID] [uniqueidentifier] NULL,CONSTRAINT [Package_PK] PRIMARY KEY CLUSTERED ( [Package_ID] ASC )WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
解决方法
尝试在SP和/或功能中封装您的查询,并比较返回的记录数.
您看到的可能会受连接ANSI设置的影响. SSMS和sql Server在每个连接上默认设置一些,像View这样的对象,它们在创建时设置,并在执行时保持不变.
检查当前为您的会话启用的选项:
https://www.mssqltips.com/sqlservertip/1415/determining-set-options-for-a-current-session-in-sql-server/
您看到的可能会受连接ANSI设置的影响. SSMS和sql Server在每个连接上默认设置一些,像View这样的对象,它们在创建时设置,并在执行时保持不变.
检查当前为您的会话启用的选项:
https://www.mssqltips.com/sqlservertip/1415/determining-set-options-for-a-current-session-in-sql-server/
检查您的视图持久化的选项:
SELECT * FROM sys.sql_modules