最近SQL2012にアップグレードし、Management Studioを使用しています。データベースの私の列の1つには、CHAR(13) + CHAR(10)
が格納されています。
SQL Server 2008を使用していたとき、これはコピーしてExcelに完全に貼り付けられました。ただし、同じデータをコピーして貼り付けると、Excelのデータに新しい行/キャリッジリターンが作成されます。
この問題を解決するためにSQL2012で見逃した設定はありますか? SELECT *
を使用して個々の列を定義する必要があるため、データベース選択ごとにREPLACE(CHAR(13) + CHAR(10))
を単純にしたくありません。
私の最善の推測は、これはバグではなく、SQL 2012の機能であるということです。それはあなたの状況ではうまく機能しないということです。
あなたは常にあなたの選択でそれらを取り除くことができます。これにより、両方のバージョンで意図したとおりにクエリが作成されます。
select REPLACE(col, CHAR(13) + CHAR(10), ', ') from table
問題の回避策を見つけました。手でコピーして貼り付ける代わりに、Excelを使用してデータベースに接続し、テーブル全体をインポートします。次に、興味のないデータを削除します。
手順は次のとおりです(Excel 2010の場合)
Data > Get external data: From other sources > From SQL Server
これで、Excelは改行を無傷のままで完全なテーブルをインポートします。
これは、Tools-> Optionsの下に、コピーまたは保存時にCR\LFを保持する新しいオプションを追加することで修正されます。 ..メニュー、クエリ結果-> SQL Server->グリッドへの結果。
変更を有効にするには、新しいセッション(ウィンドウ)を開く必要があります。
デフォルトは選択されていない(false)です。つまり、グリッドからコピー/保存すると、表示されているとおりにテキストがコピーされます(CR\LFはスペースに置き換えられます)。 trueに設定すると、テキストは実際に保存されるときにグリッドからコピー/保存されます-文字の置換は行われません。
接続項目のチェーンをたどらない場合( https://connect.Microsoft.com/SQLServer/feedback/details/735714 につながる)、この問題はSSMSのプレビューバージョンで修正されました。
これは https://msdn.Microsoft.com/library/mt238290.aspx から無料でダウンロードできます。これはスタンドアロンのダウンロードなので、完全なSQLメディアはもう必要ありません。
(注- https://msdn.Microsoft.com/library/ms190078.aspx のページは現在この情報で更新されていません。これをフォローアップしているので、新しい情報を反映する必要がありますすぐにオプション)
Excelにコピーするために、キャリッジリターン/改行を結果に含める(コピー/ヘッダー付きコピー/結果に名前を付けて保存する)ための最良の方法は、SELECT
に二重引用符を追加することです:
SELECT '"' + ColumnName + '"' AS ColumnName FROM TableName;
列データ自体に二重引用符を含めることができる場合、「二重二重引用符」によってエスケープできます。
SELECT '"' + REPLACE(ColumnName, '"', '""') + '"' AS ColumnName FROM TableName;
空の列データはSQL Management Studioで2つの二重引用符として表示されますが、Excelにコピーすると空のセルになります。 NULL
値は保持されますが、CONCAT('"', ColumnName, '"')
またはCOALESCE(ColumnName, '')
を使用して変更できます。
@JohnLBevanがコメントしたとおり、列データのエスケープは組み込み関数 QUOTENAME
を使用して行うこともできます。
SELECT QUOTENAME(ColumnName, '"') AS ColumnName FROM TableName;
@AHigginsの提案は私にとってはうまくいきました。
REPLACE(REPLACE(REPLACE(B.Address, CHAR(10), ' '), CHAR(13), ' '), CHAR(9), ' ')
これについては、ここではまだ言及されていませんが、問題を回避する方法です...
ターゲットデータベースを右クリックし、Tasks > Export data
を選択して、それを実行します。 [宛先の選択]画面の宛先の1つはMicrosoft Excelであり、クエリを受け入れるステップがあります。
これは、SQL Serverのインポートおよびエクスポートウィザードです。私が通常使用する単純なヘッダー付きコピーオプションよりもはるかに時間がかかりますが、Excelに入力するデータがたくさんある場合は、より多くのフープを介してジャンプを保存するのが価値のあるオプションです。
これは、最近「テキストから列へ」を使用したときにExcelで発生することがあります。
Excelを終了し、再度開き、もう一度貼り付けてみてください。通常はそれでうまくいきますが、ときどきコンピューターを完全に再起動する必要があると聞きました。
次の「回避策」はCRLFを保持し、列データを複数行に分割することなく、CRLF文字を含むデータをExcelに貼り付けることをサポートします。 「select *」を名前付き列に置き換える必要があり、データ内の二重引用符はすべてデリミタ値に置き換えられます。
declare @delimiter char(1)
set @delimiter = '|'
declare @double_quote char(1)
set @double_quote = '"'
declare @text varchar(255)
set @text = 'This
"is"
a
test'
-- This query demonstrates the problem. Execute the query and then copy/paste into Excel.
SELECT @text
-- This query demonstrates the solution.
SELECT @double_quote + REPLACE(@text, @double_quote, @delimiter) + @double_quote
結果をSQL Server Management Studio 2012からExcelにコピーして貼り付けたり、リスト区切り文字を使用してCsvにエクスポートしたりするには、最初にクエリオプションを変更する必要があります。
次のチェックボックスをオンにします。
.csv結果を保存するときに、リスト区切り文字を含む文字列を引用します。
これで問題が解決するはずです。
理想的でない回避策の1つは、クエリ結果をコピーするために2012データベースに対して2008 GUIを使用することです。 「CREATE AS as CREATE」などの一部の機能は動作しませんが、クエリを実行し、2012データベースからExcelなどに結果をコピーして貼り付けることができます。
マイクロソフトはこれを修正する必要があります!
クエリ結果をExcelとして保存し、ファイル拡張子を.txtに変更してみてください。 Excelを使用して開き(...で開く)、列にテキストを使用します(テキストとして書式設定)。これがこの状況で機能するかどうかはわかりませんが、Excelが自動削除するその他のフォーマットの問題ではうまく機能します。
nvarchar(max)
フィールドが含まれている場合、そのフィールドをテーブルの一番下に移動します。あなたは本当にどの行/データがキャリッジリターンを持っているかを見つけて、ソースデータを修正することができます。
UPDATEテーブルSet Field = Replace(Replace(Field、CHAR(10)、 '')、CHAR(13)、 '')WHERE Field like '%' + CHAR(10)+ '%'またはField like '%' + CHAR(13)+ '%'
多くの場合、SQLからExcelにデータをコピーする必要があるので、新しい行とタブ文字(Excelに貼り付けた後に列をシフトする)を処理する関数を作成しました。
CREATE FUNCTION XLS(@String NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @String = REPLACE (@String, CHAR(9), ' ')
SET @String = REPLACE (@String, CHAR(10), ' ')
SET @String = REPLACE (@String, CHAR(13), ' ')
RETURN @String
END
CREATE FUNCTION XLS(@String NVARCHAR(MAX) )
RETURNS NVARCHAR(MAX)
AS
BEGIN
SET @String = REPLACE (@String, CHAR(9), ' ')
SET @String = REPLACE (@String, CHAR(10), ' ')
SET @String = REPLACE (@String, CHAR(13), ' ')
RETURN @String
END
使用例:
SELECT dbo.XLS(Description) FROM Server_Inventory
Studioの変更されたバージョンはオプションではないため、すべてのクエリを変更します。上記の設定を効果なしで試してみました。 CR-LFがあったときに引用符を入れませんでした。おそらく、コンマが発生したときにのみトリガーされます。
Excelへのコピーと貼り付けは、SQLサーバーの主力です。 Mircosoftは、2008年の動作に戻すためのチェックボックスを必要とするか、1行が1行と等しくなるようにExcelへのクリップボード転送を強化する必要があります。
私は同じ問題に遭遇しました。次のソリューションを使用して、CSVに結果を取得できました。
Excelにコピーして貼り付ける代わりに、Excelにエクスポートできます。データベースを右クリック->タスク->データのエクスポート...
データにCR/LFが保持されます。
ボーナス(ヌルは「NULL」としてコピーされません)。