我正在尝试做一个内部使用过程只有它的一部分,你可以添加一个由逗号分隔的标签的字符串。字符串拆分只返回第一个条目
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE AddService
@ServiceName AS VARCHAR(MAX),
@Location AS VARCHAR(MAX),
@Description AS VARCHAR(MAX),
@PermissionType AS INT,
@Tags AS VARCHAR(MAX)
AS
BEGIN
DECLARE @ServiceId AS INT
INSERT INTO Services(NAME,LOCATION,DESCRIPTION,PERMISSIONTYPE) VALUES(@ServiceName,@Location,@Description,@PermissionType)
SET @ServiceId = (SELECT SCOPE_IDENTITY())
DECLARE @TagSplit TABLE(ID INT IDENTITY(1,1),DATA VARCHAR(MAX))
INSERT @TagSplit VALUES(SUBSTRING(@Tags,0,CHARINDEX(',',@Tags)))
WHILE EXISTS(SELECT * FROM @TagSplit)
BEGIN
DECLARE @TempId AS INT
DECLARE @Tag AS VARCHAR(MAX)
SET @TempId = (SELECT TOP 1 ID FROM @TagSplit)
SET @Tag = (SELECT TOP 1 DATA FROM @TagSplit)
INSERT INTO Tags VALUES(@ServiceId,@Tag)
DELETE FROM @TagSplit WHERE ID = @TempId
END
END
GO
但是,当我看着我的“标签”表中,给出的@Tags
字符串“一些事”只能“部分”被添加,但不是“东西”。我想我可能会误解如何在SQL中进行正确的字符串分割。
这部分不正常工作:
WHILE EXISTS(SELECT * FROM @TagSplit)
BEGIN
DECLARE @TempId AS INT
DECLARE @Tag AS VARCHAR(MAX)
SET @TempId = (SELECT TOP 1 ID FROM @TagSplit)
SET @Tag = (SELECT TOP 1 DATA FROM @TagSplit)
INSERT INTO Tags VALUES(@ServiceId,@Tag)
DELETE FROM @TagSplit WHERE ID = @TempId
END
任何帮助吗?
为什么不使用的数据类型* *设计用于容纳多个值,如表或XML,而不是给自己包含逗号的字符串? –
@Damien_The_Unbeliever我只是觉得这很容易,因为这将被使用的方式只需右键单击数据库管理器中的过程,然后单击“执行”。 – OmniOwl