使用GUID查询的问题

amingo 2010-02-05 10:54:00
declare @guids varchar(1000)
set guids ='000-000-000,111-111-111' --假设000,111是两个GUID
set guids = ''''+ replace(guids,',',''',''') +''''
print guids --这里guids的值应是'000-000-000',‘111-111-111’上面那句不知道写对没,直接在文本中写的 没试过,就是这个意思

select * from tab where guid in(guids)--这句会报错
select * from tab where guid in ('000-000-000',‘111-111-111’)--但这样不会 不知道为什么
...全文
285 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
sgtzzc 2010-02-07
  • 打赏
  • 举报
回复
--1. 构造使用IN子句的动态Transact-SQL方法进行编号查询

--a. 要查询的字段类型是数字型

--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO

--b. 要查询的字段类型是字符型
--查询的值列表已经加上了字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='''a'',''b''''a'',''c'''

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@idlist+')')
GO

--查询的值列表没有字符串边界符
DECLARE @idlist varchar(100)
SET @idlist='a,b''a,c'

--由于是字段类型是,所以在拼接时,必须为其加上字符串边界符(')
DECLARE @s varchar(1000)
SET @s=''''
+REPLACE(REPLACE(@idlist,'''',''''''),',',''',''')
+''''

--拼接并执行动态Transact-SQL语句
EXEC('SELECT * FROM tbname WHERE fdname IN('+@s+')')
GO

/*=====================================================*/


--2. 使用LIKE或者PATINDEX进行编号查询
--查询的值列表
DECLARE @idlist varchar(100)
SET @idlist='1,2,3'

--查询
SELECT * FROM tbname WHERE CHARINDEX(','+RTRIM(fdname)+',',','+@idlist+',')>0
SELECT * FROM tbname WHERE PATINDEX('%,'+RTRIM(fdname)+',%',','+@idlist+',')>0
SELECT * FROM tbname WHERE ','+@idlist+',' LIKE '%,'+RTRIM(fdname)+',%'
GO

/*=====================================================*/


--3. 编号查询中常见的错误
--a. 最容易犯的错误:表达式充当表达式列表。
DECLARE @s varchar(100)
SET @s='1'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
id name
---------------- ------------
1 sysobjects
--*/

SET @s='1,2,3'
SELECT id,name FROM sysobjects WHERE id IN(@s)
/*--结果
服务器: 消息 245,级别 16,状态 1,行 3
将 varchar 值 '1,2,3' 转换为数据类型为 int 的列时发生语法错误。
--*/
GO

--b. 生成动态Transact-SQL语句时忽略了数据类型。
DECLARE @s varchar(100)
SET @s='U,S'
EXEC('SELECT id,name FROM sysobjects WHERE id IN('+@s+')')
/*--结果:
服务器: 消息 207,级别 16,状态 3,行 1
列名 'S' 无效。
服务器: 消息 207,级别 16,状态 1,行 1
列名 'U' 无效。
--*/
GO

--c. 忽略了比较的精确性问题。
--要查询的数据
DECLARE @t TABLE(col varchar(10))
INSERT @t SELECT '1'
UNION ALL SELECT '11'
UNION ALL SELECT '111'
UNION ALL SELECT '22'

--查询
DECLARE @s varchar(100)
SET @s='111,22'
SELECT * FROM @t WHERE CHARINDEX(col,@s)>0
/*--结果
col
----------
1
11
111
22
-*/
GO
amingo 2010-02-07
  • 打赏
  • 举报
回复
declare @guids varchar(1000)
set @guids ='000-000-000,111-111-111' --假设000,111是两个GUID
set @guids = ''''+ replace(guids,',',''',''') +''''
print guids --这里guids的值应是'000-000-000',‘111-111-111’上面那句不知道写对没,直接在文本中写的 没试过,就是这个意思

select * from tab where guid in(@guids)--这句会报错
set @guids ='000-000-000'
select * from tab where guid in(@guids)--这不会报错。
amingo 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bancxc 的回复:]
有写字符串组成的sql就要动态执行才可以
[/Quote]
但如果GUIDS=‘000-000-000’就不会有问题
bancxc 2010-02-06
  • 打赏
  • 举报
回复
有写字符串组成的sql就要动态执行才可以
amingo 2010-02-06
  • 打赏
  • 举报
回复
bancxc 确实是这样。但这是为什么
bancxc 2010-02-06
  • 打赏
  • 举报
回复
第一个要动态执行
declare @guids varchar(1000) 
set @guids ='000-000-000,111-111-111'
set @guids = ''''+ replace(@guids,',',''',''') +''''
print @guids
exec( 'select * from tab where guid in('+@guids+')')
amingo 2010-02-06
  • 打赏
  • 举报
回复
没有什么变量和常量的问题@ 符号是我写掉了行不行, 能不能关注于问题本身。

declare @guids varchar(1000)
set @guids ='000-000-000,111-111-111' --假设000,111是两个GUID
set @guids = ''''+ replace(guids,',',''',''') +''''
print guids --这里guids的值应是'000-000-000',‘111-111-111’上面那句不知道写对没,直接在文本中写的 没试过,就是这个意思

select * from tab where guid in(@guids)--这句会报错
select * from tab where guid in ('000-000-000',‘111-111-111’)--但这样不会 不知道为什么
set @guids ='000-000-000'
select * from tab where guid in(@guids)--这不会报错。

为什么????????????
bobo_包子 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 beirut 的回复:]
变量和常量的问题
[/Quote]

黄_瓜 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 amingo 的回复:]
引用 16 楼 jinjiabo 的回复:
少加了@

那只是写法问题,表达的就是这个意思OK
[/Quote]
变量和常量的问题
amingo 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 jinjiabo 的回复:]
少加了@
[/Quote]
那只是写法问题,表达的就是这个意思OK
jinjiabo 2010-02-06
  • 打赏
  • 举报
回复
少加了@
amingo 2010-02-06
  • 打赏
  • 举报
回复
为什么GUIDS=‘000-000-000’就可以
jenny0810 2010-02-06
  • 打赏
  • 举报
回复
study
黄_瓜 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 amingo 的回复:]
引用 10 楼 bancxc 的回复:
有写字符串组成的sql就要动态执行才可以

但如果GUIDS=‘000-000-000’就不会有问题
[/Quote]
GUIDS=‘000-000-000’ 是个字符串值,而@guids 是个变量。
amingo 2010-02-06
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
declare @str varchar(200)
set @str='select * from tab where guid in( '+@guids+')'
exec (@str)
amingo 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 jack15850798154 的回复:]
变量和常量的问题啊。
[/Quote]
select * from tab where guid in(@guids)--这句会报错
select * from tab where guid in(@guids)--这不会报错。

程序员的综合素质真的很差。
jack15850798154 2010-02-06
  • 打赏
  • 举报
回复
变量和常量的问题啊。
amingo 2010-02-06
  • 打赏
  • 举报
回复
declare @guids varchar(1000)
set @guids ='000-000-000,111-111-111' --假设000,111是两个GUID
set @guids = ''''+ replace(guids,',',''',''') +''''
print guids --这里guids的值应是'000-000-000',‘111-111-111’上面那句不知道写对没,直接在文本中写的 没试过,就是这个意思

select * from tab where guid in(@guids)--这句会报错
select * from tab where guid in ('000-000-000',‘111-111-111’)--但这样不会 不知道为什么
set @guids ='000-000-000'
select * from tab where guid in(@guids)--这不会报错。

为什么????????????
百年树人 2010-02-05
  • 打赏
  • 举报
回复
declare @guids varchar(1000) 
set @guids = '000-000-000,111-111-111' --假设000,111是两个GUID
set @guids = ''''+ replace(@guids,',',''',''') +''''
print @guids

/**

'000-000-000','111-111-111'

**/


没错啊,不过guid应该不止这么少位数的
加载更多回复(6)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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