Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
hulk77 Member Откуда: Сообщений: 123 |
Интегрируем R в T-SQL Для большинства простых процедур объявляем nvarchar(1000) и выполняется без проблем Но сейчас нужно вписать в T-SQL-скрипт код R длиной 5000 символов Наше наблюдение, может ошибочное, но если объявить NVARCHAR(MAX) и не использовать внутри этой переменной другие переменные (например, мы должны передавать период), то в EXEC выполняется переменная и свыше 5000 символов Но когда вписываем переменную(@Token, напр): DECLARE @Q_importingVK_AdsStatistics nvarchar(max) = N' USE [' + @DB_NAME +']; DECLARE @Q_importingVK_AdsStatistics nvarchar(MAX) = N'' library(jsonlite) library(httr) h = "https://api.com/method/" access_token="'+ @Token +'" .... тогда выполнение крашится со ссылкой на неожиданный обрыв кода Скорее всего обрезает до 4000 символов Как можно передать в EXEC переменную, содержащую в себе другие переменные, с длиной свыше 4000? |
17 май 17, 18:22 [20490930] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
И как же вы объявляете переменные @Token и @DB_NAME? |
17 май 17, 18:24 [20490936] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||
17 май 17, 18:25 [20490939] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
я не считал символы, но визуально на 4/5 длины кода |
||||
17 май 17, 18:29 [20490947] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
hulk77 Советую делать так DECLARE @tsql nvarchar(max) = N' USE {DB_NAME}; DECLARE @Q_importingVK_AdsStatistics nvarchar(MAX) = N'' library(jsonlite) library(httr) h = "https://api.com/method/" access_token="{TOKEN}" ...' SET @tsql = REPLACE( @tsql, '{DB_NAME}', @DB_NAME ) SET @tsql = REPLACE( @tsql, '{TOKEN}', @token ) И портянка будет чище, и не нужно будет думать, а какую переменную забыли CONVERT( NVARCHAR(MAX)... ) |
17 май 17, 18:30 [20490951] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Сделал такDECLARE @Q_importingVK_AdsStatistics nvarchar(MAX) = N' USE [{DB_NAME}]; DECLARE @Q_importingVK_AdsStatistics nvarchar(MAX) = N'' library(jsonlite) library(httr) h = "https://api.vk.com/method/" access_token="{Token}" ver = "5.64" method = "ads.getAds" parameters = paste("account_id={AcountID}", "client_id={ClientLogin}", .... Вызывается так: SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{DB_NAME}', @DB_NAME ) SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{Token}', @Token ) SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{AcountID}', @AcountID ) SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{ClientLogin}', @ClientLogin ) SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{DateFrom}', @DateFrom ) SET @Q_importingVK_AdsStatistics = REPLACE( @Q_importingVK_AdsStatistics, '{DateTill}', @DateTill ) EXEC(' DELETE FROM [' + @DB_NAME +'].[dbo].[VK_AdsStatistics] WHERE [Date] >= ''' + @DateFrom + ''' BEGIN TRY INSERT INTO [' + @DB_NAME +'].[dbo].[VK_Statistics]([AdID],[Date],[spent],[impressions],[clicks],[reach]) EXEC ( '+ @Q_importingVK_AdsStatistics +') END TRY BEGIN CATCH END CATCH; ') Ошибка такая же:
Хотя PRINT LEN (@Q_importingVK_AdsStatistics) 5537 символов |
||
17 май 17, 18:43 [20490974] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Такой запрос выполняетсяEXEC (@Q_importingVK_AdsStatistics) Такой крашится EXEC(' DELETE FROM [' + @DB_NAME +'].[dbo].[VK_AdsStatistics] WHERE [Date] >= ''' + @DateFrom + ''' BEGIN TRY INSERT INTO [' + @DB_NAME +'].[dbo].[VK_Statistics]([AdID],[Date],[spent],[impressions],[clicks],[reach]) EXEC ( '+ @Q_importingVK_AdsStatistics +') END TRY BEGIN CATCH END CATCH; ') |
17 май 17, 19:05 [20491007] Ответить | Цитировать Сообщить модератору |
hulk77 Member Откуда: Сообщений: 123 |
Ответ - кавычки Экранировать нужно было дважды |
17 май 17, 19:09 [20491019] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Оно будет либо правильно, больше 4000, либо обрежет до 4000, из за неправильной работы с типами данных. Добейтесь сначала, что бы не обрезало, а потом просто отлаживайте выведенный принтом текст. |
||
17 май 17, 19:10 [20491024] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31779 |
Но у автора ещё и обрезание текста запроса. Вот нужно сначала, что бы не обрезало, а потом в получившимся тексте будет легко найти причину. |
||
17 май 17, 19:12 [20491027] Ответить | Цитировать Сообщить модератору |
ziktuw Member Откуда: Сообщений: 3552 |
Обрезается, потому что получившийся тип конкатенации определяется по первому операнду, который у вас "N'USE ['", что задает nvarchar(4000). Т.е. у вас собирается строка типа nvarchar(4000), которая потом приводится к типу nvarchar(max) при присваивании. Чтобы избежать этой проблемы, первый операнд в конкантенации должен быть типа nvarchar(max). Например, так "cast(N'USE [' as nvarchar(max))+....". |
||
18 май 17, 09:26 [20491775] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
так уж и по первому? а у меня, надо же, по второму. могу сделать, чтобы и по 10-ому было select len( 'a' + replicate( 'c' + cast('b' as varchar(max)), 10000) ); ---- 20001 |
||
18 май 17, 10:57 [20492166] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |