我有这个问题:
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通过展示其他帖子。
谢谢你们:)
答案 0 :(得分:0)
swe发表的评论是正确的。您可以使查询动态化,然后插入@holdIds请参阅下面的解决方法:
DECLARE @holdIds VARCHAR(MAX)
SET @holdIds = '1,2,3'
SET @holdIds = (CHAR(39) + (REPLACE(@holdIds, ',', ''',''') + CHAR(39)))
您可以这样做,然后将上面的整个查询设置为varchar变量,然后执行。当然还有其他解决方法,但动态SQL可以工作。