質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

310閲覧

SQLのNVARCHAR(MAX)を使用したTSVファイル出力時に文字が途切れる原因について

rai03k

総合スコア1

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2024/03/12 02:25

実現したいこと

SQLからタブ区切りのtsvファイルを作成したいです。
下記のbatファイルを実行すると、出力されたtsvファイルの途中で文字が途切れてしまいます。

bat

1SQLCMD -S tcp:%DB_HOST% -U %USER_NAME% -P %USER_PASSWORD% -d %DB_NAME% -i %TSV_PATH%XXX.sql -h -1 -W> %TSV_PATH%XXX.tsv -r 2>>%LOG%

XXX.sql

1SELECT 2REPLACE( REPLACE( A_NO, CHAR(13), ''), CHAR(10), '') 3+ CHAR(9) + REPLACE( REPLACE( B_NO, CHAR(13), ''), CHAR(10), '') 4+ CHAR(9) + CONVERT( NVARCHAR(MAX), A_FLG) 5+ CHAR(9) + CONVERT( NVARCHAR(MAX), B_FLG) 6+ CHAR(9) + REPLACE( REPLACE( NM_1, CHAR(13), ''), CHAR(10), '') 7+ CHAR(9) + REPLACE( REPLACE( NM_2, CHAR(13), ''), CHAR(10), '') 8+ CHAR(9) + REPLACE( REPLACE( AAA_TYP, CHAR(13), ''), CHAR(10), '') 9+ CHAR(9) + REPLACE( REPLACE( CRT_YMDHMS, CHAR(13), ''), CHAR(10), '') 10+ CHAR(9) + REPLACE( REPLACE( CRT_NM, CHAR(13), ''), CHAR(10), '') 11+ CHAR(9) + REPLACE( REPLACE( UPD_YMDHMS, CHAR(13), ''), CHAR(10), '') 12+ CHAR(9) + REPLACE( REPLACE( UPD_NM, CHAR(13), ''), CHAR(10), '') 13+ CHAR(9) + CONVERT( NVARCHAR(MAX), UPD_COUNTER) 14FROM XXX;

XXX.tsv

1XX-1 XXX-1 1 0 START189・・・7901

※正常な場合、STARTからENDまで(2000文字)表示されます。
STARTを含めて、241文字しか表示されません。

しかし、型をNVARCHAR(MAX)の箇所をNVARCHAR(200)にすると正常に出力されるようになりました。

XXX.sql

1SELECT 2REPLACE( REPLACE( A_NO, CHAR(13), ''), CHAR(10), '') 3+ CHAR(9) + REPLACE( REPLACE( B_NO, CHAR(13), ''), CHAR(10), '') 4+ CHAR(9) + CONVERT( NVARCHAR(200), A_FLG) 5+ CHAR(9) + CONVERT( NVARCHAR(200), B_FLG) 6+ CHAR(9) + REPLACE( REPLACE( NM_1, CHAR(13), ''), CHAR(10), '') 7+ CHAR(9) + REPLACE( REPLACE( NM_2, CHAR(13), ''), CHAR(10), '') 8+ CHAR(9) + REPLACE( REPLACE( AAA_TYP, CHAR(13), ''), CHAR(10), '') 9+ CHAR(9) + REPLACE( REPLACE( CRT_YMDHMS, CHAR(13), ''), CHAR(10), '') 10+ CHAR(9) + REPLACE( REPLACE( CRT_NM, CHAR(13), ''), CHAR(10), '') 11+ CHAR(9) + REPLACE( REPLACE( UPD_YMDHMS, CHAR(13), ''), CHAR(10), '') 12+ CHAR(9) + REPLACE( REPLACE( UPD_NM, CHAR(13), ''), CHAR(10), '') 13+ CHAR(9) + CONVERT( NVARCHAR(200), UPD_COUNTER) 14FROM XXX;

XXX.tsv

1XX-1 XXX-1 1 0 START189・・・5678END XXXXXXX P 20240101120000 XXX-XXXXXXX 20240101120000 (Unknown) 3

STARTからENDまでは2000文字あり、その後のカラムまですべて表示されました。
原因をお教えください。

補足情報(FW/ツールのバージョンなど)

Microsoft SQL Server 2019
Windows Server 2019 Datacenter 10.0 <X64>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rai03k

2024/03/12 05:25

SQL文をSSMSから実行し確認すると、どちらも正常に出力されていました。
guest

回答2

0

-Wのオプションと同時に使用することはできないみたいですが、
sqlcmdの次のオプションの既定値が影響しているように見えました。
*確認のために-Wのオプションを外して、-yオプションの値を変えて試してみると良いかなと思いました。

-y variable_length_type_display_width
sqlcmd スクリプト変数 SQLCMDMAXVARTYPEWIDTHを設定します。 既定値は、256 です。 長い可変長のデータ型に返される文字数を制限します。
〜〜〜省略

  • nvarchar(max)

〜〜〜省略

sqlcmd ユーティリティ - SQL Server | Microsoft Learn


STARTを含めて、241文字しか表示されません。

STARTからENDまで(2000文字)の文字列は241文字出力されていると思いますが、
タブで結合した文字列(SELECT句で1列に結合した文字列)は
既定値の256になっているのではないかと思います。

XX-1 XXX-1 1 0 (15文字)
15+241=256文字


しかし、型をNVARCHAR(MAX)の箇所をNVARCHAR(200)にすると正常に出力されるようになりました。

これを説明する情報は見つけられませんでした・・

投稿2024/03/13 11:09

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

nchar および nvarchar (Transact-SQL)

nvarchar [ ( n | max ) ]

max は、ストレージの最大サイズが 2^31-1 文字 (2 GB) であることを示します。

maxのサイズにさらに結合しているので、文字列長が最大値を超える事になり、切り捨てが生じているのではないでしょうか。

投稿2024/03/12 04:47

編集2024/03/12 12:15
sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rai03k

2024/03/12 05:25

ご回答ありがとうございます。 追加の情報として、SQL文をSSMSから実行し確認すると、どちらも正常に出力されていました。 tsv化する際に切り捨てが生じているのではないかと思うのですが・・・。
sazi

2024/03/12 12:24 編集

> SQL文をSSMSから実行し確認すると、どちらも正常に出力されていました。 表示されるテキストのサイズは違うのですよね? そうであれば、リダイレクト時に文字列サイズで欠落が生じている気がしますが、batで処理する際の制限については、見識がありません。 ただ、MAXを使用した際に表示されるサイズは確認した方が良いと思います。 長大であれば、そのまま出力してしまうと使い物にならないファイルが出来てしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問