sql – 数据库对象中的封装查询返回的行数太少

前端之家收集整理的这篇文章主要介绍了sql – 数据库对象中的封装查询返回的行数太少前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的团队成员有一些奇怪的行为,可以在开发环境和系统测试环境MS sql数据库中重新创建.

如果他直接运行这个查询,它返回517行,这是正确和预期的结果:

  1. SELECT
  2. p.package_id,la.CODE_KID
  3. FROM package p with (nolock),Strength s with (nolock),ProductCODE la with (nolock),CODE a with (nolock)
  4. where p.Strength_ID = s.Strength_ID
  5. and la.Product_ID = s.Product_ID
  6. AND la.CODE_KID = a.CODE_ID
  7. except
  8. select p.package_ID,p.CODE_KID from package p

但是,如果他在一个视图中放置相同的查询,则错误地返回311行 – 比直接运行查询少206行.

如果我们为直接查询和视图查询运行查询分析器,我们看到两个查询计划是完全不同的,但我们不明白为什么.

他还试图将查询转储到临时表中:

  1. insert into MyDB.CODE_PACKAGE
  2. SELECT
  3. p.package_id,la.CODE_KID
  4. FROM package p with (nolock),CODE a with (nolock)
  5. where p.Strength_ID = s.Strength_ID
  6. and la.Product_ID = s.Product_ID
  7. AND la.CODE_KID = a.CODE_ID
  8. except
  9. select p.package_ID,p.CODE_KID from package p

,它正确创建了一个具有517行的表.但是,如果他将相同的sql放在存储过程中,它会错误地返回311行.

看来,一旦查询被封装在数据库对象中,它返回的行数就太少了.

如上所述,他也在其他数据库系统上重新创建了错误.

有什么想法可以导致这个奇怪的行为?

他也尝试了以下没有任何成功:

>删除nolock
>设置事务隔离级别以读取未提交

更新

我不知道SSMS向导或模板是否用于创建视图,但如果我选择“脚本视图为 – > CREATE to – >新建查询编辑器窗口”,那么这是输出

  1. USE [TestUtv]
  2. GO
  3.  
  4. SET ANSI_NULLS ON
  5. GO
  6.  
  7. SET QUOTED_IDENTIFIER ON
  8. GO
  9.  
  10. CREATE view [MyDBviews].[CODE_PACKAGE]
  11. as
  12.  
  13. SELECT
  14. p.package_id,p.CODE_KID from package p
  15.  
  16. GO

这里是使用的表之一,不幸的是,数据库是相当巨大的数百个表和视图,所以我不能在这里发布所有内容.

  1. CREATE TABLE [dbo].[Package](
  2. [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
  3. (
  4. [Package_ID] ASC
  5. )WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
  6. ) 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

猜你在找的MsSQL相关文章