web-dev-qa-db-ja.com

SQL Server 2012からExcelにデータをコピーする際の新しい行の問題

最近SQL2012にアップグレードし、Management Studioを使用しています。データベースの私の列の1つには、CHAR(13) + CHAR(10)が格納されています。

SQL Server 2008を使用していたとき、これはコピーしてExcelに完全に貼り付けられました。ただし、同じデータをコピーして貼り付けると、Excelのデータに新しい行/キャリッジリターンが作成されます。

この問題を解決するためにSQL2012で見逃した設定はありますか? SELECT *を使用して個々の列を定義する必要があるため、データベース選択ごとにREPLACE(CHAR(13) + CHAR(10))を単純にしたくありません。

62
MrPink

私の最善の推測は、これはバグではなく、SQL 2012の機能であるということです。それはあなたの状況ではうまく機能しないということです。

あなたは常にあなたの選択でそれらを取り除くことができます。これにより、両方のバージョンで意図したとおりにクエリが作成されます。

select REPLACE(col, CHAR(13) + CHAR(10), ', ') from table
50
Robert Jeppesen

問題の回避策を見つけました。手でコピーして貼り付ける代わりに、Excelを使用してデータベースに接続し、テーブル全体をインポートします。次に、興味のないデータを削除します。

手順は次のとおりです(Excel 2010の場合)

  1. メニューに移動Data > Get external data: From other sources > From SQL Server
  2. SQLサーバー名(およびサーバーにWindows認証がない場合は資格情報)を入力して接続します。
  3. 改行を含むデータを含むデータベースとテーブルを選択し、「完了」をクリックします。
  4. 宛先ワークシートを選択し、「OK」をクリックします。

これで、Excelは改行を無傷のままで完全なテーブルをインポートします。

25
THelper

これは、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 のページは現在この情報で更新されていません。これをフォローアップしているので、新しい情報を反映する必要がありますすぐにオプション)

22
Charles Gagnon

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;
13
Ronald

@AHigginsの提案は私にとってはうまくいきました。

REPLACE(REPLACE(REPLACE(B.Address, CHAR(10), ' '), CHAR(13), ' '), CHAR(9), ' ')
5
Sunde

これについては、ここではまだ言及されていませんが、問題を回避する方法です...

ターゲットデータベースを右クリックし、Tasks > Export dataを選択して、それを実行します。 [宛先の選択]画面の宛先の1つはMicrosoft Excelであり、クエリを受け入れるステップがあります。

これは、SQL Serverのインポートおよびエクスポートウィザードです。私が通常使用する単純なヘッダー付きコピーオプションよりもはるかに時間がかかりますが、Excelに入力するデータがたくさんある場合は、より多くのフープを介してジャンプを保存するのが価値のあるオプションです。

3
A. Murray

これは、最近「テキストから列へ」を使用したときにExcelで発生することがあります。

Excelを終了し、再度開き、もう一度貼り付けてみてください。通常はそれでうまくいきますが、ときどきコンピューターを完全に再起動する必要があると聞きました。

3
Alex

次の「回避策」は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
1
Jim Simoens

結果をSQL Server Management Studio 2012からExcelにコピーして貼り付けたり、リスト区切り文字を使用してCsvにエクスポートしたりするには、最初にクエリオプションを変更する必要があります。

  1. [クエリ]、[オプション]の順にクリックします。
  2. [結果]の下の[グリッド]をクリックします。
  3. 次のチェックボックスをオンにします。

    .csv結果を保存するときに、リスト区切り文字を含む文字列を引用します。

これで問題が解決するはずです。

1
Paul McLeod

理想的でない回避策の1つは、クエリ結果をコピーするために2012データベースに対して2008 GUIを使用することです。 「CREATE AS as CREATE」などの一部の機能は動作しませんが、クエリを実行し、2012データベースからExcelなどに結果をコピーして貼り付けることができます。

マイクロソフトはこれを修正する必要があります!

1
Eric Steinmetz

クエリ結果をExcelとして保存し、ファイル拡張子を.txtに変更してみてください。 Excelを使用して開き(...で開く)、列にテキストを使用します(テキストとして書式設定)。これがこの状況で機能するかどうかはわかりませんが、Excelが自動削除するその他のフォーマットの問題ではうまく機能します。

0
rossmcbain
  • テーブルにnvarchar(max)フィールドが含まれている場合、そのフィールドをテーブルの一番下に移動します。
  • フィールドタイプがnvarchar(max)と異なる場合は、問題のあるフィールドを特定し、この同じ手法を使用します。
  • それを保存。
  • SQLでテーブルを再選択します。
  • 変更せずに保存できない場合は、TOOLS | OPTIONSで関連する警告を一時的に無効にすることができます。この方法にはリスクはありません。
  • ヘッダー付きのSQLグリッド表示をコピーしてExcelに貼り付けます。
  • データはキャリッジリターンを示す場合がありますが、少なくともデータはすべて同じ行にあります。
  • 次に、すべての行レコードを選択し、ID列でカスタムソートを実行します。
  • これで、すべての記録が無傷で連続しているはずです。
0
XGIS

あなたは本当にどの行/データがキャリッジリターンを持っているかを見つけて、ソースデータを修正することができます。

UPDATEテーブルSet Field = Replace(Replace(Field、CHAR(10)、 '')、CHAR(13)、 '')WHERE Field like '%' + CHAR(10)+ '%'またはField like '%' + CHAR(13)+ '%'

0
Aaron Kempf

多くの場合、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
0
essential

Studioの変更されたバージョンはオプションではないため、すべてのクエリを変更します。上記の設定を効果なしで試してみました。 CR-LFがあったときに引用符を入れませんでした。おそらく、コンマが発生したときにのみトリガーされます。

Excelへのコピーと貼り付けは、SQLサーバーの主力です。 Mircosoftは、2008年の動作に戻すためのチェックボックスを必要とするか、1行が1行と等しくなるようにExcelへのクリップボード転送を強化する必要があります。

0
user922020

私は同じ問題に遭遇しました。次のソリューションを使用して、CSVに結果を取得できました。

  1. クエリを実行する
  2. 結果グリッドの左上隅を右クリックします
  3. [結果を名前を付けて保存]を選択します。
  4. Csvとviolaを選択してください!
0
Scott Thornton

Excelにコピーして貼り付ける代わりに、Excelにエクスポートできます。データベースを右クリック->タスク->データのエクスポート...

  • ソース: SQL Server Native Client
  • 宛先: Excel
  • テーブルコピーまたはクエリの指定:クエリを選択してクエリを入力します

データにCR/LFが保持されます。

ボーナス(ヌルは「NULL」としてコピーされません)。

0
Eric Labashosky