SQL Server using in keyword pass string array query

前端 未结 3 1082
日久生厌
日久生厌 2021-01-16 20:28

I don\'t think the IN clause can accept bind parameters with multiple values. Oracle can\'t and a couple minutes

and query is

declare @setting varch         


        
相关标签:
3条回答
  • 2021-01-16 20:46

    You're misunderstanding how strings are treated in SQL Server. The string you have ('''Sales Entry Grid Cursor'',''Customer Mandatory'',''Column Uom'',''Show Marka'',''Show Discount Amount In Grid'',''Show Discount % In Grid'',''Calculation based on Weight *rate''') is one literal value, not multiple values. IN won't "work" against it because it's looking for a row has that whole string's value for PageConfig_settingsName.

    There are 2 options here. The first is to split your string and compare:

    SELECT pageconfig_action
    FROM [RetailSoft].[dbo].[tbl_pageconfig]
         CROSS APPLY STRING_SPLIT(@setting, ',') SS
    WHERE [PageConfig_settingsName] = SS.[value]
      AND PageConfig_CompanyId = 1;
    

    Note you don't needs the quotes around each utem (unless that really have those quotes in their value)

    If you aren't on SQL Server 2016+ search delimitedsplit8k (If you're on 2008), or delimitedsplit8k_lead if you're on 2012/2014.

    Otherwise, you can use a table-value variable and pass each value separately:

    DECLARE @Setting table (setting varchar(255));
    INSERT INTO @Setting (setting)
    VALUES ('Sales Entry Grid Cursor'),
           ('Customer Mandatory'),
           ('Column Uom'),
           ('Show Marka'),
           ('Show Discount Amount In Grid'),
           ('Show Discount % In Grid'),
           ('Calculation based on Weight *rate');
    
    SELECT P.pageconfig_action
    FROM [RetailSoft].[dbo].[tbl_pageconfig] P
         JOIN @Setting S ON S.setting = P.[PageConfig_settingsName]
    WHERE P.PageConfig_CompanyId = 1;
    
    0 讨论(0)
  • 2021-01-16 21:01

    You need to make Setting a table, not a varchar.
    Then there is no need for dynamic sql and you can keep it simple like this

    declare @Setting table (name varchar(50))
    
    insert into @Setting (name)
    values ('Sales Entry Grid Cursor'), 
           ('Customer Mandatory'),
           ('Column Uom'),
           ('Show Marka'),
           ('Show Discount Amount In Grid'),
           ('Show Discount % In Grid'),
           ('Calculation based on Weight *rate')
    
    Select pageconfig_action 
    from   [RetailSoft].[dbo].[tbl_pageconfig] 
    Where  [PageConfig_settingsName] in (select name from @setting)
    and    PageConfig_CompanyId=1
    
    0 讨论(0)
  • 2021-01-16 21:05

    In SQL Server 2016+: using string_split built in function. Please note, that extra single quotes are not necessary anymore:

    DECLARE @setting varchar(max)
    
    set @setting ='Sales Entry Grid Cursor,Customer Mandatory,Column Uom,Show Marka,Show Discount Amount In Grid,Show Discount % In Grid,Calculation based on Weight *rate'
    
    
    Select pageconfig_action from [RetailSoft].[dbo].[tbl_pageconfig] 
    Where [PageConfig_settingsName] in(SELECT value FROM string_split(@setting, ',') )
     and PageConfig_CompanyId=1
    

    If you run SQL Server older than SQL 2016, the answer of @GuidoG is a preferable method

    0 讨论(0)
提交回复
热议问题