Символы, усеченные с использованием типа varchar (max) - PullRequest
1 голос
/ 09 апреля 2020

В моем сохраненном профессионале c я создаю запрос Dynami c и сохраняю его в табличной переменной (записи будут выводиться по запросу Dynami c), так что эта переменная таблицы будет иметь почти 1000 записей. Затем я объединяю все строки в одно строковое значение. Моя проблема заключается в том, что после объединения символы усекаются, в результате чего создание представления V_Market не выполняется, поскольку в exe c отсутствует полный синтаксис создания представления. Я приложил образец кода здесь.

DECLARE @Names VARCHAR(max) 
DECLARE @PMC TABLE 
( 
    sqql VARCHAR(max) 
 ); 

INSERT INTO @PMC --storing dynamic queries in table
SELECT 'Select p.ID,Order_of,Field_Name, VALUE, Val from( Select  ' 
       + Cast(id AS VARCHAR(5)) 
       + ' D ,''' 
       + Cast(order_of AS CHAR(3)) 
       + ''' Order_of, ''' +ltrim(rtrim(field_name)) 
       + ''' Field_Name,sum(CAST(' + ltrim(rtrim(field_name)) 
       + ' as float)) VALUE,  ' + Val 
       + ' Val from Market  where  roll_id =21)P  ' sqql   
FROM   Market_config 

SELECT @Names = COALESCE(@Names + 'Union ', '') + sqql 
FROM   @PMC --concatenating all rows to form single string value

SELECT @Names = 'CREATE VIEW [dbo].[V_Market] AS ' 
                + @Names 
SELECT @Names  --charactrs truncated in @Names variable

EXEC (@Names) -- CREATE VIEW [dbo].[V_Market] failing from here because @Names has incomplete syntax

1 Ответ

0 голосов
/ 09 апреля 2020

Просто измените первую строку:

SELECT 'Select p.ID,Order_of,Field_Name, VALUE, Val from( Select  ' 

на:

SELECT CAST('Select p.ID,Order_of,Field_Name, VALUE, Val from( Select  ' AS VARCHAR(MAX))

, потому что при объединении varchar строк, которые не являются явно максимальными (приводится как максимум или превышает 4000 chars) результаты не преобразуются автоматически в макс.

Например, давайте объединим два 4000 символов + дополнительные символы:

EXEC sp_describe_first_result_set N'SELECT REPLICATE(''A'', 4000) + REPLICATE(''B'', 4000) + ''This will be cut'' AS [X]'

Результат будет переменной типа VARCHAR(8000).

Также может потребоваться добавить такое преобразование в остальных утверждениях.

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