当 tvp 不包含任何行时,使用输入 tvp 参数的单个 SQL 查询
Single SQL query with input tvp parameter when tvp doesn't contain any row
任何人都知道这种技巧
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
因此,returns 上面的 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
的代码更改为单个查询?
您可以改用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(并强制重新编译),因为 SQL 服务器会在存储过程第一次编译时编译查询调用。并且查询计划可能不是所有参数选择的最佳选择。
任何人都知道这种技巧
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
因此,returns 上面的 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
的代码更改为单个查询?
您可以改用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(并强制重新编译),因为 SQL 服务器会在存储过程第一次编译时编译查询调用。并且查询计划可能不是所有参数选择的最佳选择。