Sum*_*are 5 sql sql-server sql-server-2014
将记录从Char列复制到Varchar列后,我无法使用like语句找到行
Create database testDB
Go
USE [testDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TestTable1]
(
[Col_char] [char](20) NULL,
[Col_nchar] [nchar](64) NULL,
[Col_varchar] [varchar](64) NULL,
[Col_nvarchar] [nvarchar](64) NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
insert into TestTable1 values ('Sumit1%', 'Sumit1%', 'Sumit1%', 'Sumit1%')
insert into TestTable1 values ('Sumit2*', 'Sumit2*', null, 'Sumit2*')
select
[Col_char], LEN([Col_char]),
[Col_nchar], LEN([Col_nchar]),
[Col_varchar], LEN([Col_varchar]),
[Col_nvarchar], LEN([Col_nvarchar])
from
TestTable1
Run Code Online (Sandbox Code Playgroud)
这一行给了我搜索结果
select *
from TestTable1
where 'sumit1' like [Col_varchar]
Run Code Online (Sandbox Code Playgroud)
现在我正在替换*并将%[Col_char]复制到[Col_varchar]列
update TestTable1
set [Col_varchar] = Replace([Col_char], '*', '%')
where [Col_char] like '%2%'
select * from TestTable1
select * from TestTable1 where 'sumit1' like [Col_varchar]
-- this line is not showing any results
select * from TestTable1 where 'sumit2' like [Col_varchar]
select
Len(Replace([Col_char], '*', '%')),
Len(Replace([Col_varchar], '*', '%')), *
from TestTable1
Run Code Online (Sandbox Code Playgroud)
当你有SET ANSI_PADDING ON 一个CHAR(20)将永远是20个字符填充右侧空格.
当你将它转换为varchar时,你仍然有20个字符,所以你的Col_varchar值实际上是"Sumit2% " 这样你正在寻找一个以一开始的字符串,Sumit2但最后还有一堆空格
如果您使用替换值
UPDATE
TestTable1
SET
[Col_varchar] = RTRIM(REPLACE([Col_char],'*','%'))
WHERE
[Col_char] LIKE '%2%'
Run Code Online (Sandbox Code Playgroud)
它应该适合你.
关于ANSI_PADDING的信息https://msdn.microsoft.com/en-us/library/ms187403.aspx