none
SP中取得變數值時,WHERE子句應如何使用IN運算子? RRS feed

  • 問題

  • 您好:

    我有一個簡化過的SP如下:

    一個逗點分隔的字串,要計算資料表格裡有多少筆資料的ACCOUNT欄位值出現在這個字串裡

     

     

    CREATE TABLE T1 (ID int,Account nvarchar(10))
    GO

    INSERT INTO T1 VALUES  (1,'jerry')
    GO
    INSERT INTO T1 VALUES (2,'mike')
    GO
    INSERT INTO T1  VALUES (3,'aaa')
    GO


    CREATE PROC TEST01
    AS
    DECLARE @P varchar(50), @C int ,@SQL nvarchar(512)

    SET @P='jerry,jessie,mike'
    SET @P=''''+REPLACE(@P,',',''',''')+''''

    SELECT @C= COUNT(ID) FROM T1 WHERE Account IN (@P)
    PRINT(@C)

    SET @SQL=N' SELECT COUNT(ID) FROM T1 WHERE Account IN ('+@P+')'
    EXEC sp_executesql @SQL

    GO

     

    EXEC TEST01
    GO

     

    使用  SELECT @C= COUNT(ID) FROM T1 WHERE Account IN (@P) 所得到的值為0

    但 EXEC sp_executesql @SQL 可傳回 2 的正確筆數

    應該如何修改,才能讓 @C 取得正確的筆數呢?

     

    TKS.

    2008年4月17日 下午 04:18

解答

  • 問題應該是出在 IN(@P)

     

    感覺上他並沒有把@P先變成'jerry','jessie','mike'字串

     

    如果把@P改成Table型別不要用字串型別即可

     

    DECLARE @P varchar(50), @C int ,@SQL nvarchar(512)
    DECLARE @Table TABLE (c1 varchar(50))

    insert @Table values ('jerry')
    insert @Table values ('jessie')
    insert @Table values ('mike')


    SELECT @c=COUNT(ID) FROM T1 WHERE Account IN (select c1 from @table)
    print @c

    2008年4月18日 上午 03:26

所有回覆

  • 問題應該是出在 IN(@P)

     

    感覺上他並沒有把@P先變成'jerry','jessie','mike'字串

     

    如果把@P改成Table型別不要用字串型別即可

     

    DECLARE @P varchar(50), @C int ,@SQL nvarchar(512)
    DECLARE @Table TABLE (c1 varchar(50))

    insert @Table values ('jerry')
    insert @Table values ('jessie')
    insert @Table values ('mike')


    SELECT @c=COUNT(ID) FROM T1 WHERE Account IN (select c1 from @table)
    print @c

    2008年4月18日 上午 03:26
  •  

    謝謝您的回覆,

    但在原程式中,@P的值是由其他表格中取得的,

    取到的時候就已經是逗號分隔的字串了(數目不定),再轉成TABLE型別有點困難

    (有考慮過寫WHILE迴圈先塞進暫存表格裡...但這樣做好像有點呆 = =)

     

    之前詢問過講師的意見,

    使用 sp_executesql 函數取值應該也是一個方法,

    從網路上找到把變數OUTPUT出來的語法...有點不直覺就是了...@@

     

    ALTER  PROC TEST01
    AS
    DECLARE @P varchar(50), @C int ,@SQL nvarchar(512)

    SET @P='jerry,jessie,mike'
    SET @P=''''+REPLACE(@P,',',''',''')+''''

    SET @SQL='SELECT @C= COUNT(ID) FROM T1 WHERE Account IN ('+@P+')'
    EXEC sp_executesql @SQL,N'@C int OUTPUT',@C OUTPUT

    PRINT(@C)

     

     

     

    只是還是很好奇啊...為什麼不能直接用IN呢??

    2008年4月18日 上午 09:18