以下の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
PRINT (@viewsql)
をSELECT (@viewsql)
に変更します
あなたは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
)を使用してコマンドを出力します。私がコーディングしたルーチンでこれを使用して、データベースロール定義を出力しましたが、まだ失敗していません。
お役に立てば幸いです。