Функция SQL: преобразовать переменную из varchar в tinyint - PullRequest
0 голосов
/ 05 декабря 2018

Я создал функцию, в которую я положил 3 переменные:

@ yy int, @kW int, @Wert varchar (50)

Внутри этой функции я вставляю значения в@ return_variable.

У меня проблемы с @Wert, когда это выглядит так: '14, 15,1,2,4,5,6,7,27 '

create FUNCTION [dbo].[F_Work](@yy int, @kW int, @Wert varchar(50) )
RETURNS 
 @return_variable TABLE
(   Stunden int,
    kW int,
    Wert varchar(50)

)
AS
    BEGIN
        declare @Tag date;
        declare @wk int ;

            BEGIN

                 set @TAg = (select top 1 StartTime from [dbo].[Work]           
                 where  DATEPART(ISO_WEEK, StartTime) = @kW and DATEPART( YY, StartTime) = @yy order by Starttime desc)

                Insert into @return_variable (Stunden, kW, Wert  ) 
                 select SUM(ROUND(CAST(DATEDIFF(minute, A.StartTime, A.EndTime) AS float) / 60, - 0)) , DATEPART( ISO_WEEK, A.StartTime ) as KW, B.Wert     
                            FROM 
                            [dbo].[Work] A join 
                            [dbo].[Workload] B on A.TS_ID = B.TS_ID 
                            where 
                            A.TS_ID in (@Wert )

                            group by DATEPART( ISO_WEEK, A.StartTime ), B.Wert
                            order by 3,2

            END
    return
    END


--  select Stunden  from [dbo].[F_Work](2018,40,'14,15,1,2,4,5,6,7,27') 

Я получаю сообщение об ошибке: преобразование не удалось при преобразовании значения varchar '14, 15,1,2,4,5,6,7,27 'в тип данных tinyint.

Как можно ввести это значениевнутри функции.

1 Ответ

0 голосов
/ 05 декабря 2018

В выражениях типа where A.TS_ID in (@Wert) параметр не «заменяется» его строковым представлением и выполненным результатом.Вы можете сделать это с помощью динамического SQL - создайте свой запрос в виде строки и выполните его с sp_executesql.

Если вы используете SQL Server 2016 или новее, вы можете воспользоваться преимуществом STRING_SPLIT функционируйте и измените запрос так, чтобы он был примерно таким:

where A.TS_ID in (select try_cast(value as int) from STRING_SPLIT(@Wert, ','))

Но лучшее решение - просто передать список, если значения являются реальным списком, а не строкой значений, разделенных запятыми.Вы можете сделать это, определив пользовательский тип таблицы с одним столбцом и сделав параметр @Wert равным табличному параметру :

CREATE TYPE dbo.ListOfInts AS TABLE (IntValue INT);  
GO  

Затем измените определение вашей функции набыть:

create FUNCTION [dbo].[F_Work](@yy int, @kW int, @Wert dbo.ListOfInts READONLY)

, а затем вы можете использовать его в своих запросах так:

where A.TS_ID in (select IntValue from @Wert)
...