首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当tvp不包含任何行时,带有输入tvp参数的单个SQL查询

当tvp不包含任何行时,带有输入tvp参数的单个SQL查询
EN

Stack Overflow用户
提问于 2016-04-06 13:38:24
回答 1查看 622关注 0票数 2

任何人都知道这种把戏

代码语言:javascript
复制
CREATE PROCEDURE [pr_GetFinDoc]
    @id UNIQUEIDENTIFIER NULL
AS
BEGIN
    SELECT f.*
    FROM [dbo].[FinDocument] f     --id column is primary key
    WHERE @id is null or f.id = @id
END

因此,上面的procedure返回单个FinDoc或所有FinDocs。这取决于是否发送了id

只是一个单一的查询。

因此,我需要这样的东西,但对于tvp参数。

这是我的tvp参数-只是uniqueidentifier值的数组

代码语言:javascript
复制
CREATE TYPE [dbo].[GuidList] AS TABLE(
    [Id] [uniqueidentifier] NOT NULL,
    PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)

我的存储过程:

代码语言:javascript
复制
CREATE PROCEDURE [pr_GetFinDoc]
    @id_list [dbo].[GuidList] READONLY
AS
BEGIN

    IF EXISTS (SELECT 1 FROM @id_list)
        BEGIN
            SELECT f.*
            FROM
            @id_list filter 
                INNER JOIN [dbo].[FinDocument] f 
                    ON f.id = filter.Id
        END
    ELSE
        BEGIN
            SELECT f.*
            FROM [dbo].[FinDocument] f
        END
END

是否有一种方法将SPtvp input parameter代码更改为单一查询?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-06 13:41:19

您可以使用IN代替。这使您可以灵活地使用更复杂的逻辑:

代码语言:javascript
复制
select f.*
from FinDocument f
where f.id in (select id from @id_list) or
      not exists (select 1 from @id_list);

请注意,这些方法(以及您的方法)并不一定有效。if逻辑可能会使用id上的索引进行编译。通常,如果查询比较复杂,最好要么强制重新编译,要么使用动态SQL (并强制重新编译),因为Server在第一次调用存储过程时会编译查询。对于所有参数的选择,查询计划可能不是最优的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36452853

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档