我没有通过在SQL中使用IN查询传递变量来获取值

时间:2015-12-23 13:33:23

标签: sql-server

我将代码中的字符串值(例如'12th Standard/Ordinary National Diploma,Higher National Diploma')传递给SQL查询,但我没有得到任何值,也没有显示任何结果。

我的SQL查询:

declare @qua varchar(250),@final varchar(250),@Qualification varchar(250)
set @Qualification= '12th Standard/Ordinary National Diploma,Higher National Diploma'
set @qua =replace(@Qualification,',',''',''')
set @final= ''''+@qua+''''

select  * from mytablename in(@final)

结果:数据未显示

提前谢谢。

5 个答案:

答案 0 :(得分:3)

而是使用像

这样的表变量
declare @tbl table(qual varchar(250));
insert into @tbl
select '12th Standard/Ordinary National Diploma'
union
select 'Higher National Diploma';
select  * from mytablename where somecolumn in(select qual from @tbl);

答案 1 :(得分:2)

尽管尝试在其中添加引号,但您仍然只将一个字符串传递给IN。该字符串只包含嵌入式引号,SQL Server正在查找该单个长字符串。

您似乎也没有比较IN的列。

最好的办法是传入多个字符串变量,但如果不可能,那么您必须编写一个函数将单个字符串解析为结果集并使用它。例如:

SELECT
    Column1,    -- Because we never use SELECT *
    Column2
FROM
    MyTableName
WHERE
    qualification IN (SELECT qualification FROM dbo.fn_ParseString(@qualifications))

答案 2 :(得分:1)

您可以在一个表格中插入所有搜索条件,然后可以轻松地在主表格上进行查找,例如:

 DECLARE @MyTable TABLE (Name VARCHAR(10), Qualification VARCHAR(50))
   DECLARE @Search TABLE (Qualifications VARCHAR(50))

   INSERT INTO @MyTable VALUES ('User1','12th Standard'), ('User2','Some Education'),
                            ('User3','Ordinary National Diploma'), ('User4','Some Degree'),
                            ('User5','Higher National Diploma')

    INSERT INTO @Search VALUES ('12th Standard'),('Ordinary National Diploma'),('Higher National Diploma')

    SELECT MT.*
    FROM @MyTable MT
        INNER JOIN (SELECT Qualifications FROM @Search)  S ON S.Qualifications = MT.Qualification

答案 3 :(得分:0)

如前所述,您传递的是带逗号的字符串,而不是逗号分隔值。它需要分成不同的值。

您可以通过将限定字符串传递给XML来执行此操作,您可以使用该字符串将其转换为单独的数据行。 然后,IN参数将接受数据作为单独的值。

DECLARE @Qualifications as varchar(150) = '12th Standard/Ordinary National Diploma,Higher National Diploma'
Declare @Xml XML;
SET @Xml = N'<root><r>' + replace(@Qualifications, char(44),'</r><r>') + '</r></root>';
select *
from MyTableName
Where MyTableName.Qualification in 
    (select r.value('.','varchar(max)') as item
    from @Xml.nodes('//root/r') as records(r))

答案 4 :(得分:0)

或者,您可以创建一个表值函数,根据输入进行拆分,就像您的情况一样,&#39;,&#39;然后INNER JOIN与returnColumnname和您要过滤的特定列

SELECT COLUMNS, . . . . 
FROM MyTableName mtn
    INNER JOIN dbo.FNASplitToTable(@qualifications, ',') csvTable 
    ON csvTable.returnColumnName = mtn.somecolumn

表值函数可能类似于:

CREATE FUNCTION dbo.FNASplitToTable (@string varchar(MAX), @splitType CHAR(1))
RETURNS @result TABLE(Value VARCHAR(100))
AS
BEGIN

      DECLARE @x XML 
      SELECT @x = CAST('<A>' + REPLACE(@string, @splitType, '</A><A>') + '</A>' AS XML)

      INSERT INTO @result            
      SELECT LTRIM(t.value('.', 'VARCHAR(100)')) AS inVal
      FROM @x.nodes('/A') AS x(t)
    RETURN
END   
GO