Table-在 SQL 服务器中使用 IF 语句的值函数
Table-Valued Function using IF statement in SQL Server
我有一个学生 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
我想写一个名为 Show 的 Table 值函数,它有一个参数作为数字。该功能将如下
- if @number = 1 , returns 来自 Student table
的所有列
- if @number = 2 , returns 只有来自学生的城市
- if @number = 3 , returns 只有来自学生的省份
我写了下面的 T-SQL,但它只适用于 (if (@number = 1))。当用户输入 @number 为 2 或 3 时,该功能不起作用。谢谢
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)
情况2和3的插入语句不正确。插入来自 select 语句的值时不需要 VALUES 关键字。
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)
这不会工作:
INSERT INTO @result (City)
VALUES ((SELECT City from Student))
要么您将所有值作为标量SQL变量,要么是文字 - 然后您可以使用
INSERT INTO @result (City)
VALUES ('New York')
INSERT INTO @result (City)
VALUES (@ChosenCity)
或你有一个SELECT
语句来填充值——那么你需要这个语法:
INSERT INTO @result (City)
SELECT City
FROM Student
没有 VALUES
关键字。正如@GiorgiNakeuri 正确指出的那样 - 这将 失败 因为你所有的列都需要一个值(具有 NOT NULL
属性),所以这个插入不能成功 - 你需要提供 所有 NOT NULL
值(或为每列定义一个默认值)
返回的 table 取决于结果 table 的声明方式。下面的查询有效(在某种意义上),但结果包括所有带有 NULL
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)
您提到 @result
包含所有 NOT NULL
列。如果您只想将城市插入 @result
,它将把剩余的列作为 Null
,这就是发生错误的原因。您没有提到 @result
列是 NOT NULL
列,还有一个是。从 INSERT
语句中删除 VALUES
关键字,因为它使用 Select
语句插入
我有一个学生 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
我想写一个名为 Show 的 Table 值函数,它有一个参数作为数字。该功能将如下
- if @number = 1 , returns 来自 Student table 的所有列
- if @number = 2 , returns 只有来自学生的城市
- if @number = 3 , returns 只有来自学生的省份
我写了下面的 T-SQL,但它只适用于 (if (@number = 1))。当用户输入 @number 为 2 或 3 时,该功能不起作用。谢谢
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)
情况2和3的插入语句不正确。插入来自 select 语句的值时不需要 VALUES 关键字。
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)
这不会工作:
INSERT INTO @result (City)
VALUES ((SELECT City from Student))
要么您将所有值作为标量SQL变量,要么是文字 - 然后您可以使用
INSERT INTO @result (City)
VALUES ('New York')
INSERT INTO @result (City)
VALUES (@ChosenCity)
或你有一个SELECT
语句来填充值——那么你需要这个语法:
INSERT INTO @result (City)
SELECT City
FROM Student
没有 VALUES
关键字。正如@GiorgiNakeuri 正确指出的那样 - 这将 失败 因为你所有的列都需要一个值(具有 NOT NULL
属性),所以这个插入不能成功 - 你需要提供 所有 NOT NULL
值(或为每列定义一个默认值)
返回的 table 取决于结果 table 的声明方式。下面的查询有效(在某种意义上),但结果包括所有带有 NULL
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)
您提到 @result
包含所有 NOT NULL
列。如果您只想将城市插入 @result
,它将把剩余的列作为 Null
,这就是发生错误的原因。您没有提到 @result
列是 NOT NULL
列,还有一个是。从 INSERT
语句中删除 VALUES
关键字,因为它使用 Select
语句插入