【发布时间】:2021-06-10 10:31:07
【问题描述】:
我有一个如下所示的表格,Id 是标识列。
Id | StudentId | DepartmentId | Comments | Date
我需要创建一个存储过程,它接受一个由逗号分隔的 StudentId 列表,并为逗号分隔列表中的每个 StudentId 插入一个新行。
我尝试了以下方式,但这不是正确的方式
CREATE PROC usp_UpdateStudentAttendance
@StudentIds VARCHAR(max),
@DepartmentId INT
AS
BEGIN
INSERT INTO [dbo].[StudentAttendance] ([StudentId], [DepartmentId], [Comments], [Date])
SELECT CAST(Items AS INT), @DepartmentId, 'Attended', GETDATE() FROM dbo.splitstring(@StudentIds, ',')
END
我收到错误“无效的对象名称 'STRING_SPLIT'”
看起来我的数据库版本不兼容使用 STRING_SPLIT ,我们还有其他选择吗?
尝试使用以下功能。
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
【问题讨论】:
-
“我尝试了下面的方法,但那不是正确的方法” 为什么不是?我们没有
dbo.Split的定义,因此我们无法运行您的代码。为什么不使用内置函数STRING_SPLIT呢?或者修改您的过程以接受表类型参数。 -
“不是正确的方式”没有任何意义。如果您有错误,请发布它,如果它没有达到您的预期,请解释它
-
@Larnu 我厌倦了 STRING_SPLIT 并更新了我的帖子..
-
我猜你使用的是旧版本的 SQL Server,@user187,因为
STRING_SPLIT在每个受支持的 SQL Server 版本中。要么发布你的函数定义,dbo.Split,使用不同的(例如DelimitedSplit8K_LEAD,或 XML 拆分器)或使用表类型参数,然后你根本不需要拆分器。 -
这能回答你的问题吗? SQL Server split CSV into multiple rows
标签: sql sql-server tsql stored-procedures