Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 EXEC с переменной большой длины  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
И как же вы объявляете переменные @Token и @DB_NAME?
17 май 17, 18:24    [20490936]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36900
hulk77
тогда выполнение крашится со ссылкой на неожиданный обрыв кода
Скорее всего обрезает до 4000 символов
Т.е. свой код вы еще не отладили и просто гадаете на кофейной гуще?
17 май 17, 18:25    [20490939]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
hulk77
Member

Откуда:
Сообщений: 123
Гавриленко Сергей Алексеевич
hulk77
тогда выполнение крашится со ссылкой на неожиданный обрыв кода
Скорее всего обрезает до 4000 символов
Т.е. свой код вы еще не отладили и просто гадаете на кофейной гуще?


я не считал символы, но визуально на 4/5 длины кода
17 май 17, 18:29    [20490947]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
Руслан Дамирович
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]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
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;
 ')


Ошибка такая же:
автор
Неправильный синтаксис около ключевого слова "USE".
Неправильный синтаксис около конструкции ")".


Хотя
 PRINT LEN (@Q_importingVK_AdsStatistics)

5537 символов
17 май 17, 18:43    [20490974]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
hulk77
Member

Откуда:
Сообщений: 123
Ответ - кавычки
Экранировать нужно было дважды
17 май 17, 19:09    [20491019]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
hulk77
я не считал символы, но визуально на 4/5 длины кода
Не надо считать, надо использовать функцию LEN

Оно будет либо правильно, больше 4000, либо обрежет до 4000, из за неправильной работы с типами данных.

Добейтесь сначала, что бы не обрезало, а потом просто отлаживайте выведенный принтом текст.
17 май 17, 19:10    [20491024]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
hulk77
Ответ - кавычки
Экранировать нужно было дважды
Да, может, из за этого.
Но у автора ещё и обрезание текста запроса.
Вот нужно сначала, что бы не обрезало, а потом в получившимся тексте будет легко найти причину.
17 май 17, 19:12    [20491027]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
hulk77
Интегрируем 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?



Обрезается, потому что получившийся тип конкатенации определяется по первому операнду, который у вас "N'USE ['", что задает nvarchar(4000). Т.е. у вас собирается строка типа nvarchar(4000), которая потом приводится к типу nvarchar(max) при присваивании. Чтобы избежать этой проблемы, первый операнд в конкантенации должен быть типа nvarchar(max). Например, так "cast(N'USE [' as nvarchar(max))+....".
18 май 17, 09:26    [20491775]     Ответить | Цитировать Сообщить модератору
 Re: EXEC с переменной большой длины  [new]
o-o
Guest
ziktuw
получившийся тип конкатенации определяется по первому операнду

так уж и по первому? а у меня, надо же, по второму.
могу сделать, чтобы и по 10-ому было
select len( 'a' + replicate( 'c' + cast('b' as varchar(max)), 10000) );
----
20001
18 май 17, 10:57    [20492166]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить