2017年12月4日月曜日

sys.schemaのnameを使うと発生する謎の「メッセージ 8152、レベル 16、状態 2、行 8 文字列データまたはバイナリ データが切り捨てられます。」

/*
SQL Serverのバージョンによって動作が異なるのでメモをUP

異なるSQL Serverの一覧
SQL Server Version 互換レベル 現象の発生
------------------------------------------------------------
SQL Server 2012 SP3 2005~2012 問題なし
SQL Server 2016 SP1 CU2 2005~2016 エラーが発生
SQL Server 2016 SP1 CU6 2005~2016 エラーが発生

現象は、下記のクエリでエラーが発生する場合としない場合があります。
*/

begin tran
--drop table #tablelist
CREATE TABLE #tablelist (SchemaName VARCHAR (10));
SELECT max(len(s.[name])) FROM sys.schemas s JOIN sys.tables t ON s.schema_id=t.schema_id
--3
INSERT INTO #tablelist SELECT s.[name] FROM sys.schemas s JOIN sys.tables t ON s.schema_id=t.schema_id
/*
メッセージ 8152、レベル 16、状態 2、行 8
文字列データまたはバイナリ データが切り捨てられます。
ステートメントは終了されました。
そもそもinsert into selectで投入するデータの最大桁数は、3桁なのにエラーとなる。
これは、SQL Serverの欠陥と見ている。
*/
rollback tran

SELECT s.[name] FROM sys.schemas s
/*
dbo
guest
INFORMATION_SCHEMA
sys
db_owner
db_accessadmin
db_securityadmin
db_ddladmin
db_backupoperator
db_datareader
db_datawriter
db_denydatareader
db_denydatawriter

「INFORMATION_SCHEMA」があるために、#tablelistの桁が18桁必要のようです。
しかし、inner join(内部結合)でデータを持ってきていないので、本来はエラーとなるべきではない。
SQL Serverの不具合と見ています。
*/

0 件のコメント:

コメントを投稿