在一个过程中,我需要根据条件检索数据。
如果该条件为假,我需要使用LEFT OUTER JOIN,但如果该条件为真,我需要使用INNER JOIN。
这就是我的尝试。
ALTER PROCEDURE [dbo].[GetFooBarData]
@UDT VarcharUDT readonly
AS BEGIN
DECLARE @IsUDTNull BIT
SELECT @IsUDTNull = ISNULL((SELECT TOP 1 1 FROM @UDT),0)
SELECT [Foo],
[Bar]
FROM [dbo].[FooBar] FB
LEFT OUTER JOIN @UDT T ON @IsUDTNull = 0 OR FB.Foo LIKE '%' + T.Item + '%'
END
我这样称为proc
DECLARE @sa VarcharUDT
INSERT INTO @sa (Item)
SELECT 'XS0995537155'
DECLARE @return_value int
EXEC @return_value = [dbo].[GetFooBarData]
@UDT = @sa
SELECT 'Return Value' = @return_value
GO
这不按预期工作,即使UDT包含值,也会返回所有数据。
UDT
CREATE TYPE [dbo].[VarcharUDT] AS TABLE(
[Item] [varchar](100) NOT NULL,
PRIMARY KEY CLUSTERED
(
[Item] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
答案 0 :(得分:4)
如果要在一个语句中执行此操作,请使用LEFT JOIN
并检查WHERE
子句中的条件:
SELECT [Foo], [Bar]
FROM [dbo].[FooBar] FB LEFT OUTER JOIN
@UDT T
ON FB.Foo LIKE '%' + T.Item + '%'
WHERE (@UseLeftJoin = 1) OR (T.Item IS NOT NULL);