как использовать оператор печати, если у вас более 8000 символов - PullRequest
4 голосов
/ 29 октября 2011

У меня есть процедура, и код выглядит следующим образом:

ALTER PROCEDURE [dbo].[usp_Gen_Proc] 
(@ID INT )
AS
Begin

IF OBJECT_ID('tempdb..#procedure') IS NOT NULL
DROP TABLE #procedure

DECLARE @Name VARCHAR(100) 
DECLARE @SQL VARCHAR(MAX)
DECLARE @Script VARCHAR(MAX),
@DB VARCHAR(100),
@Schema VARCHAR(100),
@Proc_Name VARCHAR(max),
@BR CHAR(2)

SET @BR = CHAR(10)+ CHAR(13)

SET NOCOUNT ON 

SELECT @Name= [Procedure_Name] FROM dbo.datsource 
WHERE [ID] = @ID

SELECT  @Proc_Name = PARSENAME(@Name, 1) ,
        @Schema = PARSENAME(@Name, 2) ,
        @DB = PARSENAME(@Name, 3)


CREATE TABLE #procedure ( script VARCHAR(MAX) )

EXEC('INSERT INTO #procedure(script)
SELECT definition FROM '+@DB+'.sys.all_sql_modules sq
WHERE sq.object_id = (SELECT object_id FROM '+@DB+'.sys.objects
WHERE type = ''P'' AND name = '''+@Proc_Name+''' ) ')


SET @Script = ' Use ' +@BR  +@DB + @BR+ '  Go' +@BR

SELECT  @Script = @Script+script
FROM    #procedure


DECLARE @pos INT =7500

SELECT  @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,@pos)

PRINT SUBSTRING(@Script,1,@Pos)

DECLARE @Counter INT
SET @Counter = 0
DECLARE @TotalPrints INT
SET @TotalPrints = ( LEN(@script) / 8000 ) 
WHILE @Counter < @TotalPrints 
    BEGIN   

        SET @Counter = @Counter + 1

        PRINT SUBSTRING(@script,@pos+1,7500)
        SET @pos = @pos+7500

        SELECT  @pos=CHARINDEX(CHAR(13)+CHAR(10),@script,@pos)

    END 
END

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

Может кто-нибудь сообщить мне, где я иду не так?

1 Ответ

1 голос
/ 29 октября 2011

Почему вы хотите печатать?

Почему вы не делаете выбор с помощью скрипта, поместите его в xml, если хотите все увидеть.

Select Convert(xml, @script)

РЕДАКТИРОВАТЬ:

между вами не нужно делать +1

PRINT SUBSTRING(@script,@pos,7500)
...