sql – 数据库对象中的封装查询返回的行数太少
我的团队成员有一些奇怪的行为,可以在开发环境和系统测试环境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/ 检查您的视图持久化的选项: SELECT * FROM sys.sql_modules (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |