使用varchar选择查询'在'

时间:2016-09-01 16:25:19

标签: sql-server

我有这个问题:

DECLARE @holdIds VARCHAR(MAX)

SET @holdIds = '1,2,3'

DECLARE @flagNames NVARCHAR(MAX);

SELECT
    @flagNames = COALESCE(@flagNames + ',', '') + FlagName
FROM
    BurnHoldStatus
WHERE
    BurnHoldStatusID in (@holdIds);

SELECT @flagNames AS FlagName;

在这个例子中变量' @ holdIds'有价值观' 1,2,3'但可能只有一个值' 1'。

当我运行查询时,会出现错误:

  

Msg 245,Level 16,State 1,Line 6
  转换varchar值时转换失败' 1,2,3'数据类型int。

我尝试转换' @ holdIds'的价值但不行。

有什么想法吗?

感谢。

[UPDATE]

我找到了答案:

DECLARE @holdIds NVARCHAR(MAX);
SET @holdIds = '1,2,3';

DECLARE @holdIdList TABLE(id INT);

INSERT INTO @holdIdList 
    SELECT * FROM Split(@holdIds, ',');

DECLARE @flagNames NVARCHAR(MAX);

SELECT 
    @flagNames = COALESCE(@flagNames + ',', '') + FlagName 
FROM 
    BurnHoldStatus, @holdIdList h 
WHERE 
    BurnHoldStatusID = h.id;

SELECT @flagNames AS FlagName;

在此代码中,我使用了一个功能' Split'分裂通过除数的字符串(即:',')。

分割功能代码:

    ALTER FUNCTION [dbo].[Split]
(
    @RowData nvarchar(MAX),
    @SplitOn nvarchar(MAX)
)  
    RETURNS @RtnValue table 
(
    Data nvarchar(MAX)
) 
AS  
BEGIN 
Declare @Cnt int
Set @Cnt = 1

While (Charindex(@SplitOn,@RowData)>0)
Begin
    Insert Into @RtnValue (data)
    Select 
        Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

    Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
    Set @Cnt = @Cnt + 1
End

Insert Into @RtnValue (data)
Select Data = ltrim(rtrim(@RowData))
Return
END

感谢Vercelli通过展示其他帖子。

谢谢你们:)

1 个答案:

答案 0 :(得分:0)

swe发表的评论是正确的。您可以使查询动态化,然后插入@holdIds请参阅下面的解决方法:

DECLARE @holdIds VARCHAR(MAX)

SET @holdIds = '1,2,3'

SET @holdIds = (CHAR(39) + (REPLACE(@holdIds, ',', ''',''') + CHAR(39)))

您可以这样做,然后将上面的整个查询设置为varchar变量,然后执行。当然还有其他解决方法,但动态SQL可以工作。