2017-03-06 64 views
4

在一個proc中,我需要根據條件檢索數據。當條件爲false時,用LEFT OUTER JOIN來回複數據INNER 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 

回答

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); 
+0

加一。用它來獲取數據。 –