web-dev-qa-db-ja.com

Management Studioで文字列の文字制限を拡張する方法

以下のSQLは拡張して機能しますが、多くの列があるSSMSテーブルで出力を表示すると、カーソルによって生成された文字列が最大制限に達しているように見えるという点で途切れるように見えます。

    USE [HealthBI]
GO

/*** ENTER VIEW SCHEMA ***/
DECLARE @schema_name AS varchar(MAX) = 'trust'

/*** ENTER CDO TABLE TO REPLICATE ***/
DECLARE @table_name_value  AS varchar(MAX) = 'CDO[_]%'
DECLARE @table_name  AS varchar(MAX)
DECLARE @column_name AS varchar(MAX)
DECLARE @viewsql AS varchar(MAX)

DECLARE csr_view CURSOR FOR
SELECT TABLE_NAME ,
STUFF(( SELECT  ',' +QUOTENAME(TABLE_NAME)+'.'+QUOTENAME(COLUMN_NAME)
FROM    INFORMATION_SCHEMA.COLUMNS
WHERE   TABLE_NAME = a.TABLE_NAME
ORDER BY COLUMN_NAME 
FOR XML PATH(''),Type)
    .value('text()[1]','nvarchar(max)' ), 1, 1, '') AS value
FROM    INFORMATION_SCHEMA.COLUMNS a
where  TABLE_SCHEMA = 'dbo'
    AND TABLE_NAME like @table_name_value
    and TABLE_NAME NOT LIKE 'CDO_CDS%'
GROUP BY a.TABLE_NAME

    OPEN csr_view
        FETCH NEXT FROM csr_View INTO @TABLE_NAME, @column_name
    SET @viewsql = ''
--  PRINT @TABLE_NAME PRINT @column_name

        WHILE @@fetch_status = 0
        BEGIN

        IF OBJECT_ID('['+ @schema_name + '].[' + @table_name + ']') IS NULL
        SET @viewsql = @viewsql + '
        CREATE '
        ELSE
        SET @viewsql = @viewsql + '
        ALTER '

        SET @viewsql = @viewsql + 'VIEW [' + @schema_name + '].[' + @table_name + ']
        AS SELECT ' + @column_name + '
        FROM [dbo].[' + @table_name + ']'


        IF @schema_name = 'trust' AND @table_name <> 'CDO_MPI'
        SET @viewsql = @viewsql + '
        INNER JOIN [CDO_MPI]
        ON [CDO_MPI].[UNIQUE_ID] = [' + @table_name + '].[CDO_MPI_UNIQUE_ID]
        AND [CDO_MPI].[IS_DUMMY_PATIENT] = ''N''   GO'

        IF @schema_name = 'trust' AND @table_name = 'CDO_MPI'
        SET @viewsql = @viewsql + '
        WHERE [CDO_MPI].[IS_DUMMY_PATIENT] = ''N'''
        PRINT (@viewsql)
--       EXEC (@viewsql)

        FETCH NEXT FROM csr_View INTO @TABLE_NAME, @column_name
        SET @viewsql = ''

        END
    CLOSE csr_view
DEALLOCATE csr_View
3
Simon

PRINT (@viewsql)SELECT (@viewsql)に変更します

1
Simon

あなたはPRINTコマンドの制限に直面しています。これは、8000文字に制限されていると思います。

あなたの状況での修正は、スクリプト出力に\r\n文字が含まれているように見えるため、置き換えることです。

PRINT (@viewsql)

次のように:

DECLARE @printCur INT
SET @printCur = 8000

WHILE LEN(@viewsql) > 8000
BEGIN
     SET     @printCur = 8000 - CHARINDEX(CHAR(10) + CHAR(13), REVERSE(SUBSTRING(@viewsql, 0, 8000)))

     PRINT LEFT(@viewsql, @printCur)
     SELECT @viewsql = RIGHT(@viewsql, LEN(@viewsql) - @printCur)
END

これは@viewsql変数を反復処理し、文字列内の潜在的な区切り文字として改行(つまり\r\n)を使用してコマンドを出力します。私がコーディングしたルーチンでこれを使用して、データベースロール定義を出力しましたが、まだ失敗していません。

お役に立てば幸いです。

1
John Eisbrener