2016-05-18 5 views
3

Siehe unten stehende BeispielTabellenwertparameter Standardwert oder geben Inline

CREATE TABLE Test 
(
    CD varchar(10) not null 
) 
GO 

INSERT INTO Test VALUES ('TEST') 
GO 

CREATE TYPE [CdTable] AS TABLE (CD varchar(10)); 
GO 

CREATE FUNCTION TestTbl (@x varchar(10), @c CdTable READONLY) 
RETURNS TABLE 
AS 
RETURN 
    SELECT t.CD 
    FROM test t 
    JOIN @c c ON t.CD = c.CD OR c.CD IS NULL 
    WHERE t.CD = @x 
GO 

DECLARE @tt AS CdTable; 
INSERT INTO @tt VALUES ('TEST'); 
SELECT * FROM TestTbl('TEST', @tt); 

DELETE FROM @tt; 
INSERT INTO @tt VALUES (NULL); 
SELECT * FROM TestTbl('TEST', @tt); 
GO 

CREATE FUNCTION TestNoTbl (@x varchar(10)) 
RETURNS TABLE 
AS 
RETURN 
    SELECT * 
    FROM TestTbl(@x, ????) --<<<< how do I pass inline @c parameter with only a single row set to NULL 
GO 

Ich möchte einen Weg, um herauszufinden, entweder zu:

  1. einen Standardwert der @c zuweisen Parameter
  2. gibt es inline in einer Hilfsfunktion

Ich finde keine Möglichkeit, dies zu tun. Jeder kann helfen?

P. S .: Ich bin mit Microsoft SQL Server 2012 (oder höher)

Antwort

1

allererst Sie nicht einen Standardwert Table Valued parameter zuweisen können. Stattdessen können Sie die Funktion ändern.

Ändern der INNER JOIN-LEFT OUTER JOIN

SELECT t.CD 
FROM test t 
LEFT OUTER JOIN @c c ON t.CD = c.CD 
WHERE t.CD = @x 

obwohl die @c hält keine Datensätze, die Sie führt auf dem @x Filter erhalten basierend

Update: Basierend auf Ihre Kommentare

If exists(select 1 from @c) 
    SELECT t.CD 
    FROM test t 
    JOIN @c c ON t.CD = c.CD 
    WHERE t.CD = @x 
Else 
    SELECT t.CD 
    FROM test t 
    WHERE t.CD = @x 
+0

Dank Prdp, aber ich möchte entweder die Zeilen zurückgeben mit @c oder als a verbinden Sonderfall gibt alle Zeilen zurück. Wenn ich das tue, was Sie mir gesagt haben, filtert @c die Ergebnisse nicht mehr. – zpul

+0

@zpul - Überprüfen Sie das Update –

+0

Zwei Fragen: 1. Ist es möglich, TestTbl mit einer leeren Tabelle aufzurufen, ohne einen neuen Parameter zu deklarieren? 2. Die Abfrage in der Funktion wird sehr komplex, denken Sie, dass es eine Lösung gibt, die Code-Duplikation vermeidet? (vermeidet das Schreiben beider Abfragen zweimal eins mit dem JOIN und eins ohne) Vielen Dank im Voraus – zpul

Verwandte Themen