where 字段 in @变量

厦门德仔
博客专家认证
2010-12-23 08:29:39
昨天一个网友问我这样一个问题:

declare @si_names nvarchar(200),@txt nvarchar(4000),@sql as nvarchar(4000)
set @si_names='(''0'',''fcly'',''啦啦啦'',''我爱Home'')'


insert into ShopEmail(si_id,se_friend,se_title,se_content,se_time,se_state,se_isend,se_sendel,se_isdraft)
select '3',id,'测试一下邮箱功能','添加内容:测试一下邮箱功能,请好好配合哦!',Getdate(),'0','1','0','0' from ShopInfo where si_name in @si_names
却是报错误


insert into ShopEmail(si_id,se_friend,se_title,se_content,se_time,se_state,se_isend,se_sendel,se_isdraft)
select '3',id,'测试一下邮箱功能','添加内容:测试一下邮箱功能,请好好配合哦!',Getdate(),'0','1','0','0' from ShopInfo where si_name in ('0','fcly','啦啦啦','我爱Home')
却是OK的

我想到以前我是用动态T-SQL处理的

set @sql='select ''3'',id,''测试一下邮箱功能'',''添加内容:测试一下邮箱功能,请好好配合哦!'',Getdate(),''0'',''1'',''0'',''0'' from ShopInfo where si_name in'+ @si_names

EXEC(@sql)

没有问题

但是我一直没搞清楚原因 你能告诉我么?
...全文
147 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
-晴天 2010-12-23
  • 打赏
  • 举报
回复
create table ShopEmail(si_id varchar(10),se_friend varchar(10),se_title nvarchar(100),se_content nvarchar(100),
se_time datetime,se_state varchar(10),se_isend varchar(10),se_sendel varchar(10),se_isdraft varchar(10))
create table ShopInfo(id varchar(10),si_id varchar(10),se_friend varchar(10),se_title nvarchar(100),se_content nvarchar(100),
se_time datetime,se_state varchar(10),se_isend varchar(10),se_sendel varchar(10),se_isdraft varchar(10),si_name nvarchar(10))
go
declare @si_names nvarchar(200),@txt nvarchar(4000),@sql as nvarchar(4000)
set @si_names='(''0'',''fcly'',''啦啦啦'',''我爱Home'')'
--可以将字串 ('0','fcly','啦啦啦','我爱Home') 赋给@si_names
/*
select '3',id,'测试一下邮箱功能','添加内容:测试一下邮箱功能,请好好配合哦!',Getdate(),'0','1','0','0'
from ShopInfo where si_name in @si_names
*/
--有语法错误,是因为@si_names 只是一个字符串,而不是一个值列表 in(valueslist).
--这句:
select '3',id,'测试一下邮箱功能','添加内容:测试一下邮箱功能,请好好配合哦!',Getdate(),'0','1','0','0'
from ShopInfo where si_name in ('0','fcly','啦啦啦','我爱Home')
--in 后面就是一个值列表
set @sql='select ''3'',id,''测试一下邮箱功能'',''添加内容:测试一下邮箱功能,请好好配合哦!'',Getdate(),''0'',''1'',''0'',''0'' from ShopInfo where si_name in'+ @si_names
--这句执行后,@sql为
select '3',id,'测试一下邮箱功能','添加内容:测试一下邮箱功能,请好好配合哦!',Getdate(),'0','1','0','0' from ShopInfo where si_name in('0','fcly','啦啦啦','我爱Home')
--用 exec(@sql)运行当然没问题了.
go
drop table shopemail,shopinfo
厦门德仔 2010-12-23
  • 打赏
  • 举报
回复
exec 我试过也可以执行@sql
haitao 2010-12-23
  • 打赏
  • 举报
回复
要使用 sp_executesql
exec 是执行存储过程
厦门德仔 2010-12-23
  • 打赏
  • 举报
回复
我就不明白了好像一定要用T-SQL才能执行
厦门德仔 2010-12-23
  • 打赏
  • 举报
回复
打印出来的 完全可以执行
haitao 2010-12-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 david_520042 的回复:]
哥 我打印了 完全OK的
[/Quote]

把打印的字符串拿去执行一下
在这里也贴一下
Mr_Nice 2010-12-23
  • 打赏
  • 举报
回复
set @si_names='(''0'',''fcly'',''啦啦啦'',''我爱Home'')'

对应where si_name in @si_names in后面不符合语句要求,( ) 是被认为是字符串中的符号,而不是语句要求的括号。

同理,where si_name in ('0','fcly','啦啦啦','我爱Home') 应该是没有问题的。

exec 拼接字符串也没有问题的说。

厦门德仔 2010-12-23
  • 打赏
  • 举报
回复
哥 我打印了 完全OK的
水族杰纶 2010-12-23
  • 打赏
  • 举报
回复
print @sql
--print 下看看 ,动态里两个分号代表一个分号

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧