2012-01-03 92 views
0

我有一个需要运行IN语句的存储过程。我想知道一种方法来将字符串(逗号分隔整数列表)转换为int。在这个例子中,positionID需要转换。请帮忙。由于SQL Server存储过程将varchar转换为int

这里是我的存储过程:

Create PROCEDURE [dbo].[spCount] 
    @year varchar(50), 
    @positionID varchar(50) 
AS 
BEGIN 

Select 
    ApplicantID, [Name], PositionID, COUNT(*) AS Votes 
         FROM   dbo.vwLog 
         WHERE Year = @year And PositionID in (@positionID) 
         GROUP BY ApplicantID, [Name], PositionID 
         Order By PositionID, Votes DESC 
END 
+0

如果不使用动态sql,它会变得很难看。如果你使用的是MySQL,我会建议使用它的'find_in_set()'函数,这可以完美地工作。但SQL服务器会将完整的csv字符串插入到“in”中,并将其视为单个enity,而不是一系列不同的数字,就像您已经写入'... IN(1,2,3,...) – 2012-01-03 21:43:08

+2

请参阅这个[问题](http://stackoverflow.com/questions/3449183/error-using-csv-string-with-in-operator) – 2012-01-03 21:47:23

+0

只是使用百万分隔逗号分隔字符串函数之一返回一个TVF和联合TVF输出 – 2012-01-03 21:47:36

回答

2

你可以利用的SQL Server 2008现在支持的表类型的事实。您可以定义一个表类型,并在.net端构造一个DataTable并将其作为参数传递给您的存储过程。在SP一侧,参数的类型是[无论你所做的表类型]这里是一个例子。

TotalPositions = [Some List] //of CSV List 
DataTable Positions = new DataTable(); //Create the Datatype 
Positions.Columns.Add("PositionID", typeof(int)); // 
foreach (string sPos in TotalPositions.Split(',')) 
Positions.Rows.Add(int.Parse(sPos)); 

然后,您可以附加位置作为参数的存储过程

SqlParameter Param = new SqlParameter(); 
Param.Value = Positions 
Param.SqlDbType = SqlDbType.Structured; 
Param.ParameterName = @Positions      
command.Parameters.Add(Param); 

在你的数据库,你必须定义一个表类型

CREATE TYPE [dbo].[Positions] AS TABLE(
    [Position] int NULL, 
) 
GO 

,并在您添加存储过程

@MyPositions Positions Readonly 

现在您可以将@MyPositions作为您的过程中的表格并与其进行比较。

+0

当然我有2008年的另一台机器。我可以尝试运行它,如果我可以得到解决方案:) – 2012-01-03 21:47:29

+0

是啊碎纸机我意识到,刚才的大声笑。现在我可以编辑它成为一个答案虽然:)) – Jordan 2012-01-03 21:48:02

2

请问您通过列表必须用逗号分隔的? XML将适用于2005年及以后的版本:

DECLARE @productIds xml 
SET @productIds ='<Positions><id>3</id><id>6</id><id>15</id></Positions>' 

DECLARE @Positions TABLE (ID int) 

INSERT INTO @Positions (ID) SELECT ParamValues.ID.value('.','VARCHAR(20)') 
FROM @productIds.nodes('/Positions/id') as ParamValues(ID) 


SELECT * FROM 
    dbo.vwLog L 
INNER JOIN 
    @Positions p 
ON p.ID = L.PositionID 
相关问题