Хранимая процедура SQL Server конвертирует varchar в int - PullRequest
0 голосов
/ 04 января 2012

У меня есть хранимая процедура, которая должна запускать оператор IN.Я хочу знать, как преобразовать строку (список целых чисел через запятую) в int.В этом примере positionID необходимо преобразовать.Пожалуйста помоги.Спасибо

Вот моя хранимая процедура:

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

Ответы [ 3 ]

2 голосов
/ 04 января 2012

Должен ли передаваемый вами список быть разделенным запятыми? 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
2 голосов
/ 04 января 2012

Вы можете воспользоваться тем, что 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 голосов
/ 04 января 2012

См. SQL Server Split

И объединить это с CAST / CONVERT

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...