2015-11-26 17 views
9

Tôi có một bảng Student bao gồm các thông số saubảng giá trị Chức năng sử dụng NẾU tuyên bố trong 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 

tôi muốn viết một bảng giá trị hàm tên Hiện trong đó có một tham số như số. chức năng sẽ hoạt động như sau

  • nếu @number = 1, trả về tất cả các cột từ bảng Student
  • nếu @number = 2, sẽ chỉ trả lại thành phố từ Student
  • nếu @number = 3, chỉ trả về tỉnh từ Student

tôi đã viết T-SQL sau, nhưng nó chỉ hoạt động (nếu (@number = 1)). Khi người dùng nhập @number là 2 hoặc 3, chức năng này không hoạt động. Cảm ơn bạn

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

Không hoạt động? Không thể tin được. –

Trả lời

11

Đây là không sẽ làm việc:

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

Hoặc bạn có tất cả các giá trị như biến SQL vô hướng, hoặc literals - sau đó bạn có thể sử dụng

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

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

hoặc bạn có tuyên bố SELECT để điền các giá trị - sau đó bạn cần cú pháp sau:

INSERT INTO @result (City) 
    SELECT City 
    FROM Student 

mà không từ khóa VALUES. Và vì @GiorgiNakeuri chính xác tuyên bố - điều này sẽ là không thành công vì tất cả các cột của bạn yêu cầu giá trị (có thuộc tính NOT NULL), do đó chèn này không thể thành công - bạn cần cung cấp tất cảNOT NULL giá trị (hoặc xác định giá trị mặc định cho mỗi cột)

+2

Bạn đã bỏ lỡ rằng tất cả các cột không phải là nullable. –

+0

@GiorgiNakeuri: đúng - đã cập nhật phản hồi của tôi –

+0

@marc_s tôi muốn ID không được vô hiệu. nó không âm thanh logic trong cơ sở dữ liệu của tôi để đặt nó nullable, nhưng chức năng sẽ không làm việc với điều đó. tôi không có ý tưởng làm thế nào để sửa chữa nó. –

1

Câu lệnh chèn cho trường hợp 2 và 3 không chính xác. Không cần VALUES từ khóa khi chèn các giá trị đến từ một câu lệnh chọn.

+0

tôi xóa từ khóa VALUES. do đó, nó sẽ trở thành như: IF (@number = 2) INSERT INTO @result (Thành phố) (SELECT City from Student) nhưng, vẫn không hoạt động. –

+2

Tất nhiên bạn không cần (và) paranthesis - những cũng nên được loại bỏ là tốt. –

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, có thể bạn muốn biết điều gì sai trong câu trả lời này? Hai từ bị thiếu? :) – Devart

+3

Có hai từ bị thiếu. Ngoài ra nó sẽ không hoạt động vì tất cả các cột trong bảng không phải là nullable, và không ai nhận thấy điều đó. –

+0

@Giorgi Nakeuri cảm ơn bạn đã bình luận – Devart

2

bảng được trả lại được quyết định bởi cách bảng kết quả được khai báo. truy vấn dưới đây làm việc (theo nghĩa) nhưng kết quả bao gồm tất cả các cột với NULL s cho các cột không nhắm mục tiêu bởi tham số @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

Bạn nói @result có tất cả NOT NULL cột. Nếu bạn chỉ muốn chèn thành phố vào đó @result, nó sẽ lấy các cột còn lại là Null vì vậy đó là lý do tại sao một lỗi xảy ra. Bạn không đề cập đến các cột @resultNOT NULL cột và một cột khác. Xóa VALUES từ khóa từ câu hỏi INSERT vì nó được chèn với tuyên bố Select

+0

Có, nó giúp ích. Nhưng vấn đề là kết quả được cung cấp với một bảng mà chỉ có một cột có dữ liệu và tất cả các cột khác có giá trị NULL mà không nhìn tốt. –

+0

@ user3187561 bạn có muốn thay thế các giá trị null này bằng bất kỳ giá trị nào khác không? –

+0

Không, tôi chỉ muốn giá trị NULL được ẩn trong kết quả. ví dụ: nếu tôi đọc @number = 2 từ người dùng, kết quả sẽ chỉ là cột Thành phố có giá trị, không phải các cột khác có NULL. –

Các vấn đề liên quan