declare @kh_fax varchar(50)
set @kh_fax='0371-'
select * from kh_tb where kh_fax like ''%'+@kh_fax+'%''
运行后出现错误提示:“数据类型 varchar 和 varchar 在 modulo 运算符中不兼容”
后改为
select * from kh_tb where kh_fax like '%'+@kh_fax+'%'
去掉一个单引号
替换变量后应该是这样:
select * from kh_tb where kh_fax like '%0371-%'
也就是说这里的 sql语句中的单引号 如 C#中的双引号一样,声明字符串
(在动态sql语句中是两个单引号代表一个 带单引号的字符串,最外面需要再由一堆单引号包括,如C#中一样字符串必须由双引号扩住,和C#中 “\”转定义一样,如:
declare @str nvarchar(2000)
declare @time1 nvarchar(50)
declare @time2 nvarchar(50)
set @time1='2013-3-20'
set @time2='''2013-3-27'''
print @time1
--结果是 2013-3-20
print @time2
--结果是 '2013-3-27'
set @str='select * from KH_tb where add_time between '+char(39)+@time1+char(39)+' and '+@time2+''
exec(@str)
print @str
结果是 select * ...... between '2013-3-20' and '2013-3-27'
所以:动态语句的 单引号是用来包括字符串的,像@time1,就是原模原样的输出来了,而如果要输出@time2的带单引号的结构,那么它必须除了sql语句 特定包含字符串的两个单引号外(前后总共两个),字符串本身得含有单引号,而在单引号中包含单引号的话,就需要转定义,像C#一样"\",但SQL中用的是两个单引号代表1个单引号(仅限在动态sql中),当然也可以使用char(39)来代替单引号,这样可能更清楚明了
)