2014-10-07 106 views
0

您可以给我一些指示(或指向正确的方向上谷歌什么搜索条件)?在存储过程中,我有一个参数@TAG(字符串)。我从另一个不能更改的应用程序收到'(14038314,14040071)'(例如)。在存储过程中,我需要拆分'(14038314,14040071)'以在每个字符串值周围加上引号,重新构建它,删除外部引号,去掉这些parens并将它传递给@TAG,以便查询它看起来像下面注释的线?SQL Server 2012 - 操纵存储过程的字符串数据

SELECT 
    V.NAME AS VARIETY, TAGID 
FROM 
    mfinv.dbo.onhand h 
INNER JOIN 
    mfinv.dbo.onhand_tags t on h.onhand_id = t.onhand_id 
INNER JOIN 
    mfinv.dbo.onhand_tag_details d on t.onhand_tag_id = d.onhand_tag_id 
INNER JOIN 
    mfinv.dbo.FM_IC_PS_VARIETY V ON V.VARIETYIDX = d.VARIETYIDX 
LEFT JOIN 
    mfinv.dbo.FM_IC_TAG TG ON TG.TAGIDX = t.TAGIDX 
WHERE 
    h.onhand_id = (SELECT onhand_id FROM mfinv.dbo.onhand 
        WHERE onhand_id = IDENT_CURRENT('mfinv.dbo.onhand')) 
    AND TG.ID IN (@TAG) 
    --AND TG.ID IN ('14038314','14040071') 
+2

http://sqlperformance.com/2012/07/t-sql-queries/拆分字符串 – 2014-10-07 19:35:32

+0

@salmon我已发布的答案你可以试试吗? – 2014-10-07 19:43:35

+0

@Ganesh_Devlekar我正在努力使其工作。 – 2014-10-07 21:29:04

回答

0

这里就是我所做的。谢谢大家的回应。感谢dasblinkenlight回答“如何替换sql server中列的第一个和最后一个字符?”。感谢SQLMenace回答“如何在不创建函数的情况下在SQL Server中拆分分隔字符串?”。

这里是我如何去掉括号:

@Tag nvarchar(256) 
SET @Tag = SUBSTRING(@Tag, 2, LEN(@Tag)-2) 

下面是如何分裂和重建@Tag:

AND TG.ID in 
(

SELECT SUBSTRING(',' + @Tag + ',', Number + 1, 
    CHARINDEX(',', ',' + @Tag + ',', Number + 1) - Number -1)AS VALUE 
    FROM master..spt_values 
    WHERE Type = 'P' 
    AND Number <= LEN(',' + @Tag + ',') - 1 
    AND SUBSTRING(',' + @Tag + ',', Number, 1) = ',' 
) 
0

您可以使用动态SQL像这样

DECLARE @TAG Nvarchar(MAX)='14038314,14040071' 
set @TAG=''''+REPLACE(@TAG,',',''',''')+'''' 
--select @TAG 

DECLARE @SQL NVARCHAR(MAX)=N' 
Select V.NAME AS VARIETY, TAGID 
FROM mfinv.dbo.onhand h 
INNER JOIN mfinv.dbo.onhand_tags t on h.onhand_id = t.onhand_id 
INNER JOIN mfinv.dbo.onhand_tag_details d on t.onhand_tag_id = d.onhand_tag_id 
INNER JOIN mfinv.dbo.FM_IC_PS_VARIETY V ON V.VARIETYIDX = d.VARIETYIDX 
LEFT JOIN mfinv.dbo.FM_IC_TAG TG ON TG.TAGIDX = t.TAGIDX 
WHERE h.onhand_id = (SELECT onhand_id FROM mfinv.dbo.onhand 
WHERE onhand_id = IDENT_CURRENT (''mfinv.dbo.onhand'')) 
AND TG.ID IN ('[email protected]+')' 

PRINT @SQL 
EXEC (@SQL) 
+0

这很容易发生sql注入。这种方法根本不是一个好方法。 – 2014-10-07 20:20:08

相关问题