创建一张表,然后往里面添加三笔数据
CREATE TABLE Table_GuidTestIn
(
Guid UNIQUEIDENTIFIER PRIMARY KEY,
name NVARCHAR(50)not null
)
insert into Table_GuidTestIn(Guid,name)values(NEWID(),'111')
insert into Table_GuidTestIn(Guid,name)values(NEWID(),'222')
insert into Table_GuidTestIn(Guid,name)values(NEWID(),'333')
select * from Table_GuidTestIn
1.通常写法
SELECT * FROM dbo.Table_GuidTestIn WHERE Guid IN ('FEC2C17B-6C11-49D1-9E6F-7D78230A0548','80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD','02E74C94-A4C0-40D6-A67E-FE563E767422')
SELECT * FROM Table_GuidTestIn
WHERE CHARINDEX(','+LTRIM(Guid)+',',','+'FEC2C17B-6C11-49D1-9E6F-7D78230A0548,80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD,02E74C94-A4C0-40D6-A67E-FE563E767422'+',')>0
注意:使用CHARINDEX不能写成以下写法,这样会导致数据丢失
总而言之,CHARINDEX(','+LTRIM(Guid)+',',','+'FEC2C17B-6C11-49D1-9E6F-7D78230A0548,80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD,02E74C94-A4C0-40D6-A67E-FE563E767422'+',')>0 必须同行,不能折行
2.存储过程的写法
第一种写法
CREATE PROCEDURE TestIn
@strGuid varchar(500) /*strGuid 是guid列表, 类似1,2,3*/
AS
BEGIN
EXEC ('select * from Table_GuidTestIn where guid in('+@strGuid+')')
END
第二种写法
CREATE PROCEDURE [dbo].[TestInCharindex]
@strGuid varchar(500) /*strGuid 是guid列表, 类似1,2,3*/
AS
BEGIN
select * from Table_GuidTestIn where charindex(','+ltrim(guid)+',',','+@strGuid+',')>0
END
执行存储过程 TestIn 、TestInCharindex
EXEC TestIn '''FEC2C17B-6C11-49D1-9E6F-7D78230A0548'',''80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD'',''02E74C94-A4C0-40D6-A67E-FE563E767422'''
EXEC TestInCharindex 'FEC2C17B-6C11-49D1-9E6F-7D78230A0548,80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD,02E74C94-A4C0-40D6-A67E-FE563E767422'
注意:Guid比较特殊,所以在存储过程中使用IIN写法需要注意,传入的参数格式必须是
'aa57adce-0c4f-4c73-b3de-f941c7e702d5','cb4cc8bc-2f6d-4cd6-a6df-27146c9dd86e'
也就是说 string Guid=" 'aa57adce-0c4f-4c73-b3de-f941c7e702d5','cb4cc8bc-2f6d-4cd6-a6df-27146c9dd86e' ";
在上文执行存储过程 TestIn特别标注红色,提醒看文的同志们。
在执行 TestIn 如果写成以下去执行则会报错
EXEC TestIn 'FEC2C17B-6C11-49D1-9E6F-7D78230A0548,80AD7D07-18DE-4AB9-8CB8-9A5481AC1CFD,02E74C94-A4C0-40D6-A67E-FE563E767422'
如果是查询 name 这个字段则不会出现这样的错误
CREATE PROCEDURE [dbo].[TestInName]
@strName varchar(500) /*@strName 是name列表, 类似1,2,3*/
AS
BEGIN
EXEC ('select * from Table_GuidTestIn where name in('+@strName+')')
END
执行存储过程
EXEC TestInName '111,222'
备注:函数以及触发器也是同样的原理
本文链接:https://my.lmcjl.com/post/2079.html
4 评论