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'

備註:函數以及觸發器也是同樣的原理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章