这应该很简单,但我可以为我的生活找到答案。基本上我有一个更新数据库的存储过程。在数据库中,我有forename和surname列,存储过程正在执行业务逻辑。我想要做的是,如果有人试图输入多个名称,它会根据一系列替换语句识别出来,如果找到任何名称则返回NULL,例如在下面的代码中它正在寻找“/”(好像它正在寻找像John / Jill这样的人,就像下面的示例代码一样:
Declare @Forename Varchar(50)
Set @Forename = 'John'
Select Replace(@Forename,'/',NULL)
然而,即使没有/存在,它也不会重新调整'John'而返回NULL。我有一个谷歌,但我找不到任何东西。当然在我的真实代码中有许多嵌套的替换语句,但这只是为了向您展示我遇到的问题。任何帮助都会很棒。
提前致谢
答案 0 :(得分:2)
NULL
都返回NULL
,因此结果并不令人惊讶。在SQL Server中执行所需操作的最简单方法可能是:
Select left(@Forename, charindex('/', @Forename + '/') - 1)
charindex()
找到/
(如果有) - + '/'
确保找到斜杠。 left()
然后选择所有字符,直到之前的字符。
答案 1 :(得分:1)
根据文件:
如果任何一个参数为NULL,则返回NULL。
https://msdn.microsoft.com/en-us/library/ms186862.aspx
编辑:
如果我理解你的原始要求,你需要这样的东西:
select case when @forename like '%[/]%' then null else @forename end
在这里,您可以使用额外的"分隔符"扩展'%[/]%'
。字符。
答案 2 :(得分:0)
您必须在SQL中创建自定义Split方法,它将使用'/'分隔符拆分您的名称字符串。如果您的@Forename字符串中包含“/”。
以下是Split方法的示例代码:
CREATE FUNCTION [dbo].[SplitString]
(
@string NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @output TABLE(splitdata NVARCHAR(MAX)
)
BEGIN
DECLARE @start INT, @end INT
SELECT @start = 1, @end = CHARINDEX(@delimiter, @string)
WHILE @start < LEN(@string) + 1 BEGIN
IF @end = 0
SET @end = LEN(@string) + 1
INSERT INTO @output (splitdata)
VALUES(SUBSTRING(@string, @start, @end - @start))
SET @start = @end + 1
SET @end = CHARINDEX(@delimiter, @string, @start)
END
RETURN
END
GO
用法:
Select * from dbo.SplitString(@Forename,'/')