Fil*_* DO 2 sql t-sql database sql-server special-characters
我搞砸了,允许用户在他们创建公司名称的地方创建公司名称,如下所示:Tom & Marks Ice Cream Shop。
问题是该公司名称有一个链接,其他人可以点击该链接来查看该公司的简介,而 .net 会抛出一个错误,指出不允许使用危险字符。
我不担心公司名称是否准确,当用户注意到“&”消失时,他们可以自行更新它。
如何使用 SQL 语法更新 SQL 中的列,删除所有特殊字符并在特殊字符的位置添加空格?
有没有办法在sql中识别列值中是否有特殊字符?
UPDATE [BuildingPros].[utbProfessionals]
SET [ProfessionalName] = Replace([ProfessionalName],'some character',' ')
WHERE ProfessionalName =ProfessionalName
Run Code Online (Sandbox Code Playgroud)
这是查找字符串是否包含特殊字符的示例代码。你可以试试这个
DECLARE @MyString VARCHAR(100)
SET @MyString = 'abcdef&&&&ybyds'
IF (@MyString LIKE '%[^a-zA-Z0-9]%')
BEGIN
SET @MyString = Replace(@MyString,'&',' ')
PRINT 'Contains "special" characters'
PRINT @MyString
END
ELSE
BEGIN
PRINT 'Does not contain "special" characters'
PRINT @MyString
END
Run Code Online (Sandbox Code Playgroud)
您的 UPDATE 查询将如下所示:-
UPDATE [BuildingPros].[utbProfessionals]
SET [ProfessionalName] =
(
CASE
WHEN [ProfessionalName] LIKE '%[^a-zA-Z0-9]%'
THEN Replace(REPLACE( ProfessionalName, SUBSTRING( ProfessionalName, PATINDEX('%[~,@,#,$,%,&,*,^,&,%,*,(,)]%', ProfessionalName), 1 ),''),'-',' ')
ELSE [ProfessionalName]
END
)
Run Code Online (Sandbox Code Playgroud)
或者您可以创建一个函数来删除特殊的 char 函数,然后在 Update 语句下调用它。
1) 从字符串值中删除特殊字符。2) 除 0-9、az 和 AZ 之外的所有字符均被删除,3) 返回剩余字符。
create function dbo.RemoveSpecialChars (@s varchar(256)) returns varchar(256)
with schemabinding
begin
if @s is null
return null
declare @s2 varchar(256)
set @s2 = ''
declare @l int
set @l = len(@s)
declare @p int
set @p = 1
while @p <= @l begin
declare @c int
set @c = ascii(substring(@s, @p, 1))
if @c between 48 and 57 or @c between 65 and 90 or @c between 97 and 122
set @s2 = @s2 + char(@c)
set @p = @p + 1
end
if len(@s2) = 0
return null
return @s2
end
Run Code Online (Sandbox Code Playgroud)
然后在更新语句中调用此函数:-
UPDATE [BuildingPros].[utbProfessionals]
SET [ProfessionalName] =
(
CASE
WHEN [ProfessionalName] LIKE '%[^a-zA-Z0-9]%'
THEN (SELECT dbo.RemoveSpecialChars(ProfessionalName))
ELSE [ProfessionalName]
END
)
Run Code Online (Sandbox Code Playgroud)