2011-09-12 20 views
7
DECLARE @str VARCHAR (MAX); 

SELECT @str = COALESCE(@str + CHAR(10), '') + 
     'EXECUTE CreateDeno ' + CAST(ID AS VARCHAR) 
FROM GL_To_Batch_Details 
WHERE TYPE = 'C' AND 
     Deno_ID IS NULL; 

--PRINT @str;--SELECT @str; 
**EXEC(@str);** 

EDITEDT-SQL VARCHAR (MAX) okrojone

Czy EXECUTE oświadczenie obciąć ciągi do 8000 znaków jak PRINT? Jak mogę wykonać dynamiczne polecenie SQL mające więcej niż 8000 znaków?

Wszelkie sugestie będą mile widziane.

+3

myślę, że są zdezorientowani, nie można 'PRINT' więcej niż 8000 znaków, to nie znaczy, że @str jest bycie obcinane – Lamak

+0

Mam pytanie edytowane być bardziej szczegółowe na ten problem. Faktycznie, gdy EXECUTE wygenerował błąd, użyłem PRINT, aby zobaczyć, jaki był wygenerowany dynamiczny T-SQL. W obu przypadkach wartości nvarchar (MAX) zostały obcięte. Jakieś pomysły? –

Odpowiedz

12

PRINT jest ograniczona do wyjścia 8k.

Istnieje również limit 8k w okienku wyników SSMS.

idź do

Narzędzia -> Opcje -> query powoduje

aby zobaczyć opcje.

Aby sprawdzić długość rzeczywistych danych, należy sprawdzić:

SELECT LEN(@str)

+0

OK. PRINT jest tu używany zamiast EXEC, aby zobaczyć, jaki jest faktyczny problem. –

+0

@Nick Bennet: [MSDN mówi] (http://msdn.microsoft.com/en-us/library/ms188332 (v = SQL.90) .aspx): We wcześniejszych wersjach SQL Server ciągi znaków są ograniczone do 8 000 bajtów. Wymaga to łączenia dużych ciągów w celu dynamicznej realizacji. W SQL Server 2005 można określić typy danych varchar (max) i nvarchar (max), które pozwalają na przesyłanie ciągów znaków do 2 gigabajtów danych. – Andomar

+0

Musiałem użyć typu danych NVARCHAR (MAX) wraz z sp_executesql, aby uzyskać działanie. Czy mógłbyś potwierdzić, że to samo można osiągnąć bez użycia sp_executesql? Dzięki. –

2

default length tematyce varchar jest 30 znaków:

CAST (ID AS VARCHAR) 

to możliwe, że id jest dłuższy niż 30 znaków?

+0

Nie, identyfikator nie może być dłuższy niż 30 znaków. –

+1

Zaleca się, aby nigdy nie używać domyślnej długości, w innych przypadkach domyślna wartość len wynosi 1. – HLGEM

2

Komenda PRINT jest z pewnością ograniczona do 8000 znaków, niezależnie od długości wyjścia (lub od tego, czy jest to varchar (max)). Aby obejść ten problem trzeba wyjściu ciąg w kawałki <8000 znaków


UPDATE: W odpowiedzi na edycję, exec nie ogranicza długości ciągu. I już ułożyła poniższym przykładzie pokazać to:

DECLARE @str VARCHAR (MAX); 


;WITH CTE_Count AS 
(
    select counter = 1 
    union all 
    select counter = counter+1 
    from CTE_Count 
    Where counter < 2000 

) 
SELECT    
    @str=COALESCE(@str + CHAR (10) , 
     '') + 'select value=' + CAST (counter AS VARCHAR) 
from 
    CTE_Count 

Option (MAXRECURSION 0) 

PRINT len(@str);--SELECT @str; 

exec (@str) 

Running to drukuje długość jak 34892 znaków, a wszystkie 2000 wykonywać instrukcje nie działają (ostrzegamy, może to potrwać kilka godzin!)

0

Zdarza się, kiedy złączyć literały jeśli ktoś nie jest varchar (max) wynik źle być „ukryte lanego” do VARCHAR (8000).

Aby wygenerować dosłowny varchar (max), wszystkie części muszą być varchar (max). Uwaga: Zdarzyło mi się robić aktualizacje na kolumnach varchar (max), nigdy nie testowane przy użyciu polecenia EXEC.

Ponadto, jak zauważono w poprzednich odpowiedziach, polecenie drukowania zawiera ograniczenie, ale możesz spróbować wybrać tę zmienną zamiast ją drukować. (Również Ther jest granica tego Wybierz długość można skonfigurować na MS-SMS)

1

Kiedy łączenie ciągów, a wynik jest typu VARCHAR (MAX) i jest ponad 8000 znaków, przynajmniej jeden parametr i/lub element użyte w konkatenacji muszą być typu VARCHAR (MAX), w przeciwnym wypadku pojawi się obcięcie w wynikowym łańcuchu i nie będzie możliwe do wykonania w instrukcji EXEC.

przykład:

DECLARE @sql AS VARCHAR(MAX); 
/* DECLARE @someItem AS VARCHAR(100); -- WILL CAUSE TRUNCATION WHEN @sql HAS LEN > 8000 */ 
DECLARE @someItem AS VARCHAR(MAX); -- All string variables need to be VARCHAR(MAX) when concatenating to another VARCHAR(MAX) 

SET @someItem = 'Just assume the resulting @sql variable goes over 8000 characters...'; 
SET @sql = 'SELECT Something FROM Somewhere WHERE SomeField = ''' + @someItem + ''''; 

EXEC (@sql); 
--PRINT @sql; 

Więcej informacji na MSDN.

„Jeśli wynik konkatenacji ciągów przekracza limit 8000 bajtów, wynik jest obcięty. Jednakże, jeżeli co najmniej jedna z ciągi łączone to rodzaj dużej wartości, obcinanie nie występują . "

0

Chciałem również zobaczyć, co wysyłam do Exec, i byłem zdezorientowany przez limit PRINT. Musiał napisać proc, aby wydrukować w kawałkach.

CREATE PROCEDURE [dbo].[KFX_PrintVarcharMax] 
    @strMax varchar(max) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE 
     @index int = 0, 
     @start int = 1, 
     @blkSize int = 2000; 


    WHILE @Start < LEN(@strMax) 
    BEGIN 
     IF @start + @blkSize >= LEN(@strMax) 
     BEGIN 
      -- If remainder is less than blocksize print the remainder, and exit. 
      PRINT SUBSTRING(@strMax, @start, @blkSize) 
      BREAK; 
     END 
     -- Else find the next terminator (beyond the blksize) 
     SET @index = CHARINDEX(CHAR(10), @strMax, @start + @blkSize); 
     if @index >= @start 
     BEGIN 
      PRINT SubString(@strMax, @start, @index - @start + 1) 
      SET @start = @index + 1; 
      SET @blkSize = CASE WHEN @start + 2000 < LEN(@strMax) THEN 2000 
          ELSE LEN(@strMax) - @start + 1 END 
     END 
     ELSE 
     BEGIN 
      -- No char(10) found. Just print the rest. 
      PRINT SUBSTRING(@strMax, @start, LEN(@strMax)) 
      BREAK; 
     END 
    END 

END 
Powiązane problemy