Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用逗号分隔参数的sql搜索查询帮助_Sql Server_Tsql_Search - Fatal编程技术网

Sql server 使用逗号分隔参数的sql搜索查询帮助

Sql server 使用逗号分隔参数的sql搜索查询帮助,sql-server,tsql,search,Sql Server,Tsql,Search,我正在寻找类似的内容,但无法找到编写查询的最佳方法: SELECT DISTINCT CategoryID FROM tbl_Categories c INNER JOIN mappingTable mp ON c.CategoryID = mp.CategoryID INNER JOIN SubCategories sc ON mp.SubCategoryID = sc.SubCategoryID WHERE sc.SubcategoryID IN ALL (234,245,645)

我正在寻找类似的内容,但无法找到编写查询的最佳方法:

SELECT DISTINCT CategoryID FROM tbl_Categories c INNER JOIN 
  mappingTable mp ON c.CategoryID = mp.CategoryID INNER JOIN
  SubCategories sc ON mp.SubCategoryID = sc.SubCategoryID
WHERE sc.SubcategoryID IN ALL (234,245,645)
我目前正在构建一个动态查询,因为ID是作为逗号分隔的字符串“234245645”传入的,但我们都知道,没有all这样的东西。基本上,我想返回列表中包含所有子类别的所有类别。希望这是有意义的

您可以这样做:

解决方案1 解决方案2:另一种可能有效的方法: 您可以这样做:

解决方案1 解决方案2:另一种可能有效的方法:
您可以编写自己的拆分函数:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

然后,您可以加入或选择此表值用户定义函数返回的表。

您可以编写自己的拆分函数:

CREATE FUNCTION [dbo].[Split]
(
    @ItemList NVARCHAR(MAX), 
    @delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))  
AS      

BEGIN    
    DECLARE @tempItemList NVARCHAR(MAX)
    SET @tempItemList = @ItemList

    DECLARE @i INT    
    DECLARE @Item NVARCHAR(4000)

    SET @tempItemList = REPLACE (@tempItemList, ' ', '')
    SET @i = CHARINDEX(@delimiter, @tempItemList)

    WHILE (LEN(@tempItemList) > 0)
    BEGIN
        IF @i = 0
            SET @Item = @tempItemList
        ELSE
            SET @Item = LEFT(@tempItemList, @i - 1)
        INSERT INTO @IDTable(Item) VALUES(@Item)
        IF @i = 0
            SET @tempItemList = ''
        ELSE
            SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
        SET @i = CHARINDEX(@delimiter, @tempItemList)
    END 
    RETURN
END  

然后,您可以加入或选择从这个表值用户定义函数返回的表。

由于您的问题有点不清楚,所以不确定您是否真的想要它

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @IDs NVARCHAR(MAX)

SET @IDs = '234,245,645'

SET @SQL = 'SELECT DISTINCT CategoryID FROM tbl_Categories c INNER JOIN 
  mappingTable mp ON c.CategoryID = mp.CategoryID INNER JOIN
  SubCategories sc ON mp.SubCategoryID = sc.SubCategoryID
WHERE sc.SubcategoryID IN  (' + @IDs + ')'


exec (@sql)

不确定你到底想要什么,因为你的问题有点不清楚

DECLARE @SQL NVARCHAR(MAX) 
DECLARE @IDs NVARCHAR(MAX)

SET @IDs = '234,245,645'

SET @SQL = 'SELECT DISTINCT CategoryID FROM tbl_Categories c INNER JOIN 
  mappingTable mp ON c.CategoryID = mp.CategoryID INNER JOIN
  SubCategories sc ON mp.SubCategoryID = sc.SubCategoryID
WHERE sc.SubcategoryID IN  (' + @IDs + ')'


exec (@sql)

创建一个拆分函数,将CSV转换为表值,然后将表值函数连接到select子句以限制结果。看

快速示例要求您创建一个理货表,如下所示:


创建一个拆分函数,将CSV转换为表值,然后将表值函数连接到select子句以限制结果。看

快速示例要求您创建一个理货表,如下所示:

字符串从中拆分副本。 请注意,您需要一个尾随“,”

字符串拆分的其他实现可能更适合您,但这说明了如何处理“ALL”条件

字符串从中拆分副本。 请注意,您需要一个尾随“,”


字符串拆分的其他实现可能更适合您,但这显示了如何处理“ALL”条件。

我不知道列表的计数,虽然我不知道列表的计数,但我希望它与所有@IDs匹配,虽然我希望它与所有@IDs匹配,但使用此方法拆分值并根据返回的表联接实际上有一个ALL。但我不认为这对您有什么帮助:。使用它来拆分您的值并根据返回的表进行连接实际上有一个ALL。但我不认为这对你有帮助。
-- Parameter string
declare @ParamStr varchar(100) = '234,245,645'

-- Convert param to xml
declare @XMLStr xml = convert(xml, '<r>'+replace(@ParamStr, ',', '</r><r>')+'</r>')

-- Store param values in table variable
declare @T table (ID int)
insert into @T 
select r.value('.', 'int')
from @XMLStr.nodes('r') r(r)

-- Get the number of parameters
declare @ParamCount int = (select count(*) from @T)

-- Get the categoryids
select CategoryID
from mappingTable
where SubCategoryID in (select id from @T)
group by CategoryID
having count(CategoryID) = @ParamCount
CREATE FUNCTION [dbo].[TallySplit] (@Delim CHAR(1), @String VARCHAR(8000))
    RETURNS TABLE AS 
    RETURN (
    SELECT SUBSTRING(@Delim + @String + @Delim,N+1,CHARINDEX(@Delim,@Delim + @String + @Delim,N+1)-N-1) ListValue
    FROM Tally
    WHERE N < LEN(@Delim + @String + @Delim)
    AND SUBSTRING(@Delim + @String + @Delim,N,1) = @Delim 
    )
GO
DECLARE @vCatIDs varchar(max)
SET @vCatIDs = '234,245,645'
SELECT DISTINCT CategoryID FROM tbl_Categories c 
  INNER JOIN mappingTable mp ON c.CategoryID = mp.CategoryID 
  INNER JOIN SubCategories sc ON mp.SubCategoryID = sc.SubCategoryID
  INNER JOIN dbo.TallySplit(',',@vCatIDs) ts ON ts.ListValue = sc.SubCategoryID
DECLARE @Delimitedtext varchar(max);
DECLARE @Delimiter char(1);
SET @Delimitedtext = '234,245,645,';
SET @Delimiter = ',';

;WITH Strings(s, r)
AS
(
SELECT
SUBSTRING(@Delimitedtext,1, CHARINDEX(@Delimiter, @Delimitedtext)-1) s,
SUBSTRING(@Delimitedtext,CHARINDEX(@Delimiter, @Delimitedtext)+1, len(@Delimitedtext)) r
UNION ALL
SELECT
SUBSTRING(r,1, CHARINDEX(@Delimiter, r)-1) s,
SUBSTRING(r,CHARINDEX(@Delimiter, r)+1, len(r)) r
FROM Strings
WHERE
CHARINDEX(@Delimiter, r) > 0
)

SELECT  CategoryId
FROM    (
            SELECT  c.CategoryID
            FROM    tbl_Categories c 
            JOIN    mappingTable mp 
                ON  c.CategoryID = mp.CategoryID 
            JOIN    SubCategories sc 
                ON  mp.SubCategoryID = sc.SubCategoryID
            WHERE   sc.SubcategoryID IN (SELECT s FROM Strings)
        ) x
GROUP BY CategoryId
HAVING COUNT(*) = (SELECT count(*) FROM Strings)