任何人都知道这种把戏
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值的数组
CREATE TYPE [dbo].[GuidList] AS TABLE(
[Id] [uniqueidentifier] NOT NULL,
PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)我的存储过程:
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是否有一种方法将SP的tvp input parameter代码更改为单一查询?
发布于 2016-04-06 13:41:19
您可以使用IN代替。这使您可以灵活地使用更复杂的逻辑:
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在第一次调用存储过程时会编译查询。对于所有参数的选择,查询计划可能不是最优的。
https://stackoverflow.com/questions/36452853
复制相似问题