0

我不认为 IN 子句可以接受具有多个值的绑定参数。甲骨文不能和几分钟

查询是

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 (@setting)
   and PageConfig_CompanyId = 1

结果为空

并在关键字中直接传入字符串

Select pageconfig_action 
From [RetailSoft].[dbo].[tbl_pageconfig] 
Where [PageConfig_settingsName] in ('Sales Entry Grid Cursor', 'Customer Mandatory', 'Column Uom', 'Show Marka', 'Show Discount Amount In Grid', 'Show Discount % In Grid', 'Calculation based on Weight *rate')
  and PageConfig_CompanyId=1

那么结果就ok了

4

3 回答 3

1

你需要做Setting一个表,而不是一个varchar。
那么就不需要动态sql,你可以像这样保持简单

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
于 2019-01-29T10:26:02.507 回答
1

在 SQL Server 2016+ 中:使用string_split内置函数。请注意,不再需要额外的单引号:

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

如果您运行 SQL Server 早于 SQL 2016,@GuidoG 的答案是一种更可取的方法

于 2019-01-29T10:31:12.547 回答
0

您误解了 SQL Server 中如何处理字符串。您拥有的字符串 ( '''Sales Entry Grid Cursor'',''Customer Mandatory'',''Column Uom'',''Show Marka'',''Show Discount Amount In Grid'',''Show Discount % In Grid'',''Calculation based on Weight *rate''') 是一个文字值,而不是多个值。IN不会对它“起作用”,因为它正在寻找具有整个字符串值的行PageConfig_settingsName

这里有 2 个选项。首先是拆分字符串并进行比较:

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

请注意,您不需要每个 utem 周围的引号(除非它们的值中确实包含这些引号)

如果您不在 SQL Server 2016+ 上,请搜索 delimitedsplit8k(如果您在 2008 年),如果您在 2012/2014 年,则搜索 delimitedsplit8k_lead。

否则,您可以使用表值变量并分别传递每个值:

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;
于 2019-01-29T10:32:53.387 回答