2015-09-01 2 views
0
CREATE FUNCTION [dbo].[func_1] 
(
    @ListNum AS nvarchar(MAX) 
) 
RETURNS @t TABLE 
(
    col_1 nvarchar(MAX) 
) 
AS 
BEGIN 
INSERT @t 

SELECT col_1 
FROM table_name 
WHERE col_2 IN (@ListNum) 

RETURN 
END 

Когда я передаю только одно значение в paramater (например: 1), функция правильно работает, но как передать несколько значений (например: 1,2,3,4,5). Я получаю следующую ошибку:Множество значений по одному параметру

Procedure execution failed 
42000 - [SQL Server]Error converting data type nvarchar to bigint. 

Есть ли простой способ решить эту проблему?

+0

Вы должны котировки – HoneyBadger

+0

Это не будет работать, потому что вы получите 'ВЫБРАТЬ col_1 FROM table_name WHERE col_2 IN ('1,2,3,4,5')', и вы, вероятно, хотите 'Select col_1 FROM table_name WHERE col_2 IN (1,2,3,4,5) ' – lad2025

+0

Я забыл упомянуть, что col_2 - это bigint. Куда мне помещать кавычки? –

ответ

0

Привет, вы можете попробовать, как это,

CREATE FUNCTION Splitstring (@Input  NVARCHAR(MAX), 
          @Character CHAR(1)) 
RETURNS @Output TABLE (
    Item NVARCHAR(1000)) 
AS 
    BEGIN 
     DECLARE @StartIndex INT, 
       @EndIndex INT 

     SET @StartIndex = 1 

     IF Substring(@Input, Len(@Input) - 1, Len(@Input)) <> @Character 
     BEGIN 
      SET @Input = @Input + @Character 
     END 

     WHILE Charindex(@Character, @Input) > 0 
     BEGIN 
      SET @EndIndex = Charindex(@Character, @Input) 

      INSERT INTO @Output 
         (Item) 
      SELECT Substring(@Input, @StartIndex, @EndIndex - 1) 

      SET @Input = Substring(@Input, @EndIndex + 1, Len(@Input)) 
     END 

     RETURN 
    END 

GO 

CREATE FUNCTION [dbo].[Func_1] (@ListNum AS NVARCHAR(MAX)) 
RETURNS @t TABLE (
    col_1 NVARCHAR(MAX)) 
AS 
    BEGIN 
     INSERT @t 
     SELECT p.col1 
     FROM dbo.Splitstring(@ListNum, ',') s 
      JOIN Table_Name t 
       ON t.col2 = s.Item 

     RETURN 
    END 

DECLARE @var VARCHAR(100)='1,2,3,4' 

SELECT * 
FROM dbo.Func_1(@var) 

Введем еще одну функцию, называемую разбить строку. Он вернет список, разделенный запятыми, в виде таблицы. Присоедините таблицу, разделенную запятыми, фактической таблицей. Это даст результат.

+0

Это * не * хорошая идея. SQL Server уже предоставляет параметры таблицы. Даже если вам нужно разделить строки, цикл - это самый медленный способ сделать это. Во всяком случае, на этот вопрос уже ответил несколько раз –

0

Для версий 2008+ с использованием значений, разделенных таблицами, может помочь, когда вызывающая процедура может построить таблицу, и вы можете создать тип таблицы. Если вы должны передавать запятую (или другие значения, разделенные символами) в одной строке, вам нужно будет разделить строку с разделителями-запятыми на собственный результат.

Метод XML хорошо работает, когда ваша строка не содержит каких-либо специальных символов XML, такие как угловые скобки <> - how-to-split-a-comma-separated-value-to-columns

Я думаю, что это будет работать для скорректированного функции;

CREATE FUNCTION [dbo].[func_1] 
(
    @ListNum AS nvarchar(MAX) 
) 
RETURNS @t TABLE 
(
    col_1 nvarchar(MAX) 
) 
AS 
BEGIN 



DECLARE @S varchar(max), 
     @Split char(1), 
     @X xml 

SELECT @S = @ListNum, 
     @Split = ',' 

SELECT @X = CONVERT(xml,' <root> <s>' + REPLACE(@S,@Split,'</s> <s>') + '</s> </root> ') 



INSERT @t 

SELECT col_1 
FROM table_name 
WHERE col_2 IN (SELECT [Value] = T.c.value('.','varchar(20)') 
FROM @X.nodes('/root/s') T(c)) 

RETURN 
END 
+0

Все текущие версии поддерживаемых таблиц SQL Server поддерживают параметры. Больше не нужно использовать отдельные строки –

+0

Это верно, и этот ответ должен быть отмечен как правильный ответ. Хорошо иметь различные методы разделения значений для неудачливых людей, которые все еще работают над выпусками ниже, чем SQL Server 2008. (Я кодируюсь в 2005 году) –

+0

Кодирование по неподдерживаемой версии не является забавным. Тем не менее, разделение строк было рассмотрено исчерпывающе, и есть * несколько способов сделать это, включая использование CTE, XML и наиболее масштабируемое решение SQL CLR. [Aaron Bertrand] (http://sqlperformance.com/2012/07/t-sql-queries/split-strings) даже опубликовал тесты всех методов в 2012 году –