2015-11-26 5 views
9

ich Student Tisch besteht aus folgenden ParameternTabellenwertfunktion unter Verwendung von IF-Anweisung in SQL Server

[ID] [nvarchar](50) NOT NULL, 
[Firsname] [nvarchar](50) NOT NULL, 
[Lastname] [nvarchar](50) NOT NULL, 
[Melicode] [nchar](10) NOT NULL, 
[City] [nvarchar](50) NOT NULL, 
[Province] [nvarchar](50) NOT NULL, 
[Active] [int] NULL 

Ich möchte eine Tabellenwertfunktion namens anzeigen schreiben, die einen Parameter als Nummer hat. Die Funktion wird wie folgt

  • handeln, wenn @number = 1, alle Spalten aus Tabelle Student zurück
  • wenn @number = 2, kehrt nur Stadt von Studenten
  • wenn @number = 3, kehrt nur Provinz von Student

Ich schrieb die folgende T-SQL, aber es funktioniert nur für (if (@number = 1)). Wenn der Benutzer @number als 2 oder 3 eingibt, funktioniert die Funktion nicht. Danke

Create function Show(@number int) 
RETURNS @result TABLE 
(
    [ID] [nvarchar](50) NOT NULL, 
    [Firsname] [nvarchar](50) NOT NULL, 
    [Lastname] [nvarchar](50) NOT NULL, 
    [Melicode] [nchar](10) NOT NULL, 
    [City] [nvarchar](50) NOT NULL, 
    [Province] [nvarchar](50) NOT NULL, 
    [Active] [int] NULL 
) 
AS 
BEGIN 

    IF (@number = 1) 
     INSERT INTO @result SELECT * from Student 

    IF (@number = 2) 
     INSERT INTO @result (City) values ((SELECT City from Student)) 

    IF (@number = 3) 
     INSERT INTO @result (Province) values ((SELECT Province from Student)) 

    RETURN -- @Players (variable only required for Scalar functions) 

END 

go 
select *from dbo.show(1) 
+0

einfügen funktioniert nicht? Kann nicht glauben. –

Antwort

11

Dies ist nicht zur Arbeit gehen:

INSERT INTO @result (City) 
VALUES ((SELECT City from Student)) 

Entweder Sie die Werte alle als skalare SQL-Variablen haben oder Literale - dann können Sie

INSERT INTO @result (City) 
VALUES ('New York') 

INSERT INTO @result (City) 
VALUES (@ChosenCity) 

verwenden oder Sie haben eine SELECT Anweisung, um die Werte zu füllen - dann müssen Sie diese Syntax:

INSERT INTO @result (City) 
    SELECT City 
    FROM Student 

ohne das VALUES Stichwort. Und wie @GiorgiNakeuri richtig heißt - das wird dann scheitern weil alle Ihre Spalten einen Wert erfordern (haben das NOT NULL Attribut), so dass dieser Einsatz kann nicht erfolgreich sein - Sie alleNOT NULL Werte zur Verfügung stellen müssen (oder einen Standardwert für jede definieren Spalte)

+2

Sie haben übersehen, dass für alle Spalten keine Nullwerte zulässig sind. –

+0

@GiorgiNakeuri: korrekt - aktualisiert meine Antwort –

+0

@marc_s Ich möchte die ID nicht Nullable sein. Es klingt nicht logisch in meiner Datenbank, um es nullbar zu machen, aber Funktion würde nicht damit arbeiten. Ich habe keine Ahnung, wie ich es beheben kann. –

1

Die Einfügeanweisungen für die Fälle 2 und 3 sind falsch. Keine Notwendigkeit für das Schlüsselwort VALUES beim Einfügen von Werten aus einer SELECT-Anweisung.

+0

Ich lösche das Schlüsselwort VALUES. So wird es wie folgt: IF (@number = 2) INSERT IN @result (Stadt) (SELECT Stadt von Student) aber immer noch nicht funktioniert. –

+2

Natürlich brauchen Sie die (und) Paranthesis nicht - diese sollten ebenfalls entfernt werden. –

2
CREATE FUNCTION dbo.Show 
(
    @number INT 
) 
RETURNS @result TABLE 
(
    ID NVARCHAR(50), 
    Firsname NVARCHAR(50), 
    Lastname NVARCHAR(50), 
    Melicode NCHAR(10), 
    City NVARCHAR(50), 
    Province NVARCHAR(50), 
    Active INT 
) 
AS 
BEGIN 

    IF (@number = 1) 
     INSERT INTO @result 
     SELECT * FROM dbo.Student 

    IF (@number = 2) 
     INSERT INTO @result (City) 
     SELECT City FROM dbo.Student 

    IF (@number = 3) 
     INSERT INTO @result (Province) 
     SELECT Province FROM dbo.Student 

    RETURN 

END 
GO 

SELECT * FROM dbo.Show(2) 
+0

@Giorgi Nakeuri, vielleicht willst du erzählen, was in dieser Antwort falsch ist? Zwei Wörter fehlen? :) – Devart

+3

Ja, zwei Wörter fehlen. Es funktioniert auch nicht, weil alle Spalten in der Tabelle nicht nullbar sind, und niemand hat das bemerkt. –

+0

@Giorgi Nakeuri Danke für deinen Kommentar – Devart

2

Die zurückgegebene Tabelle hängt davon ab, wie die Ergebnistabelle deklariert wurde. die Abfrage funktioniert unten (in gewissem Sinne), aber die Ergebnisse sind alle Spalten mit NULL s für diese Spalten nicht vom @number Parameter gezielt:

CREATE TABLE dbo.z_Show (str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10)) 

INSERT z_show 
SELECT 1, 1, 1 UNION ALL 
SELECT 2, 2, 2 UNION ALL 
SELECT 3, 3, 3 

CREATE FUNCTION dbo.Show(@number int) 
RETURNS @result TABLE 
(
    --[ID] [nvarchar](50) NOT NULL, 
    --[Firsname] [nvarchar](50) NOT NULL, 
    --[Lastname] [nvarchar](50) NOT NULL, 
    --[Melicode] [nchar](10) NOT NULL, 
    --[City] [nvarchar](50) NOT NULL, 
    --[Province] [nvarchar](50) NOT NULL, 
    --[Active] [int] NULL 
    str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10) 
) 
AS 
BEGIN 
--for debugging|start 
--DECLARE @number INT = 3 
--DECLARE @result TABLE (str1 VARCHAR(10), str2 VARCHAR(10), str3 VARCHAR(10)) 
--for debugging|end 

    IF (@number = 1) 
    BEGIN 
      --PRINT ('IF (@number = 1)') 
     INSERT INTO @result SELECT * from dbo.z_Show 
    END 

    IF (@number = 2) 
    BEGIN 
     --PRINT ('IF (@number = 2)') 
     INSERT INTO @result (str2) SELECT str2 from dbo.z_Show 
    END 

    IF (@number = 3) 
    BEGIN 
      --PRINT ('IF (@number = 3)') 
     INSERT INTO @result (str3) SELECT str3 from dbo.z_Show 
    END 

    RETURN -- @Players (variable only required for Scalar functions) 
END 

SELECT 'number 1 was passed', * 
FROM dbo.show(1) 

SELECT 'number 2 was passed', * 
FROM dbo.show(2) 

SELECT 'number 3 was passed', * 
FROM dbo.show(3) 
2

Sie erwähnten @result alle NOT NULL Spalten. Wenn Sie nur die Stadt in das @result einfügen möchten, werden die verbleibenden Spalten als Null akzeptiert, weshalb ein Fehler aufgetreten ist. Sie erwähnen nicht, dass @result Spalten NOT NULL Spalten sind und eine weitere ist. Entfernen Sie VALUES Schlüsselwort aus der INSERT Anweisung, weil es mit einer Select Anweisung

+0

Ja, es hilft. Aber das Problem ist das Ergebnis ist mit einer Tabelle zur Verfügung gestellt, die nur eine Spalte Daten und alle anderen Spalten haben den NULL-Wert, der nicht gut aussieht. –

+0

@ user3187561 Möchten Sie diese Nullwerte durch andere Werte ersetzen? –

+0

Nein, ich wollte nur, dass der NULL-Wert im Ergebnis versteckt wird. Zum Beispiel, wenn ich die @Number = 2 von Benutzer lese, sollte das Ergebnis nur City-Spalte mit Wert sein, nicht andere Spalten mit NULL. –

Verwandte Themen