加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:21:55 所属栏目:MsSql教程 来源:网络整理
导读:我的团队成员有一些奇怪的行为,可以在开发环境和系统测试环境MS SQL数据库中重新创建. 如果他直接运行这个查询,它返回517行,这是正确和预期的结果: SELECT p.package_id,la.CODE_KID FROM package p with (nolock),Strength s with (nolock),ProductCODE la
我的团队成员有一些奇怪的行为,可以在开发环境和系统测试环境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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读