我将代码中的字符串值(例如'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)
结果:数据未显示
提前谢谢。
答案 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