SqlServer-IN写法(普通、存储过程)

创建一张表,然后往里面添加三笔数据

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 评论

留下您的评论.