2015-11-26 15 views
9

Ho una tabella Studente si compone di seguenti parametricon valori di tabella funzioni utilizzando IF 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 

Voglio scrivere una funzione denominata Mostra tabella con valori che ha un parametro come numero. la funzione agirà come segue

  • se @number = 1, restituisce tutte le colonne dalla tabella Student
  • se @number = 2, restituisce solo città da Student
  • se @number = 3, restituisce solo Provincia da Student

ho scritto il seguente T-SQL, ma funziona solo per (if (@number = 1)). Quando l'utente immette @number come 2 o 3, la funzione non funziona. Grazie

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

Non funziona? Non posso credere –

risposta

11

Questo è non andare a lavorare:

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

O avete tutti i valori come variabili scalari SQL, o letterali - quindi è possibile utilizzare

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

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

o hai una dichiarazione SELECT per riempire i valori - allora avete bisogno di questa sintassi:

INSERT INTO @result (City) 
    SELECT City 
    FROM Student 

senza la parola chiave VALUES. E come @GiorgiNakeuri giustamente - questo sarà poi fallire perché tutte le colonne richiedono un valore (avere l'attributo NOT NULL), quindi questo inserto non può avere successo - è necessario fornire tuttiNOT NULL valori (o definire un valore predefinito per ogni colonna)

+2

Ti sei perso che tutte le colonne non sono annullabili. –

+0

@GiorgiNakeuri: corretto - aggiornato la mia risposta –

+0

@marc_s voglio che l'ID non sia annullabile. non sembra logico nel mio database per metterlo a zero, ma la funzione non funzionerebbe con quello. non ho idea di come aggiustarlo –

1

Le istruzioni di inserimento per i casi 2 e 3 non sono corrette. Non è necessario per la parola chiave VALUES quando si inseriscono valori provenienti da un'istruzione select.

+0

cancello la parola chiave VALUES. quindi diventa come: IF (@number = 2) INSERT INTO @result (Città) (SELECT City from Student) ma, ancora non funziona. –

+2

Ovviamente non hai bisogno della (e) paranza - anche queste dovrebbero essere rimosse. –

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, forse vuoi dire cosa c'è che non va in questa risposta? Mancano due parole? :) – Devart

+3

Sì, mancano due parole. Inoltre non funzionerà perché tutte le colonne nella tabella non sono annullabili e nessuno l'ha notato. –

+0

@Giorgi Nakeuri grazie per il tuo commento – Devart

2

la tabella restituita è dettata da come è stata dichiarata la tabella dei risultati. la query di seguito lavora (in un certo senso), ma i risultati comprendono tutte le colonne con NULL s per quelle colonne non mirati dal parametro @number:

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

È menzionato @result ha tutte NOT NULL colonne. Se si desidera inserire solo la città in tale @result, le colonne restanti saranno come Null, ecco perché si è verificato un errore. Non si menziona che le colonne @result sono colonne NOT NULL e un'altra è. Rimuovi la parola chiave VALUES dall'istruzione INSERT perché sta inserendo con una dichiarazione Select

+0

Sì, aiuta. Ma il problema è che il risultato è fornito con una tabella in cui solo una colonna ha i dati e tutte le altre colonne hanno il valore NULL che non ha un bell'aspetto. –

+0

@ user3187561 vuoi sostituire questi valori nulli con altri valori? –

+0

No, volevo solo che il valore NULL venisse nascosto nel risultato. per esempio se leggo @number = 2 dall'utente, il risultato dovrebbe essere solo la colonna Città con valore, non altre colonne con NULL. –

Problemi correlati