none
SQLServerのストアドプロシージャでNプレフィックスを使いたい RRS feed

  • 質問

  • SQLServerのストアドプロシージャであるテーブルにインサートを行いますが

    その際の項目について、Nプレフィックスを使いたいのですがうまくいきません。

    何か方法があれば教えて下さい。

    サンプル-----------------------------

    BEGIN

    insert into テーブル

    values( 引数1 )

    END

    サンプル-----------------------------

    環境:SQLServer 2005 英語版

    引数1は上記、ストアドを実行する際の引数です。
    この引数をN''で囲みたいのですが方法が分かりません。
    どなたかわかる方がいらっしゃれば御教授願います。

     

    2011年1月4日 8:18

回答

  • 挿入結果が ?? になっていることを、どのようにして確認されていますか? 確認方法に問題があって、表示時に ?? になっている可能性もあります。(SQL Server では、NVARCHAR のデータを VARCHAR で取り出すと、変換できない文字を ? にするので、確認方法に問題がある可能性があります)

    ストアドのパラメータが NVARCHAR で、挿入されたデータが ?? になっている場合、ストアドを呼び出す側が間違っていて、ストアドにわたってきた時点ですでに ?? になってしまっている可能性を疑うと良いかと思います。

    また、N-prefix は文字列定数を NVARCHAR で定義するものです。すでに NVARCHAR で受け取っている場合には必要ありません。イメージとしては、「VARCHAR を NVARCHAR に変換する」ようなものだと考えてください。ただし、定数用なので、パラメータや変数には使用できません。VARCHAR 型のパラメータや変数を NVARCHAR に変換するためには、CAST または CONVERT を使用します。今回の場合は、すでに引数を NVARCHAR で受け取っているので、そのような変換は必要ありません。

     

    • 回答としてマーク naru0112 2011年1月5日 5:20
    2011年1月4日 23:49
  • 日本語版のSQL Serverであったとしても、既定のコードページはJapanese(コードページ932)でインストールされます。これはS-JISです。したがって、Nプレフィックスを付けなければS-JISとして扱われます。つまり、NVARCHARでパラメーターが定義してあったとしても、Nプレフィックスを付ける必要があります。経験はありませんが、英語版のSQL Serverの既定のコードページでは、日本語自体が文字化けするのではないでしょうか?
    どのような形でストアドプロシージャを実行されているのかわかりませんが、以下の形でストアドプロシージャを実行すればうまくいくと思います。

    exec ストアドプロシージャ N'文字列'

     #(追記)コードページ932は、正確にはS-JISを拡張したものです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク naru0112 2011年1月5日 5:20
    • 編集済み trapemiya 2011年1月5日 7:05 追記
    2011年1月5日 0:55

すべての返信

  • CREATE PROCEDURE 名前 (引数1 AS VARCHAR)

    となっていると思いますが、これを

    CREATE PROCEDURE 名前 (引数1 AS NVARCHAR)

    と、N を付与してあげると、N 付きになります。(インサート側はかえなくてもよいです)

    2011年1月4日 10:11
  • 返信ありがとうございます。

    引数1はNVARCHARで宣言はしております。

    元のインサートで日本語をSQLのテーブルにセットすると

    文字が『??』になります。

    テーブル側の型もNVERCHARで宣言しています。

    色々探してみましたが、Nプリフックスを付けるという所には当たるのですが

    ストアドで付けようとすると、’が定数の宣言になってしまいうまくいきません。

    例:values( N’引数1’ )

    とすると、引数1という定数になってしまいます。

    ストアドではNプリフィックスは使えないのでしょうか?

    どなたかわかられば御教授願います。

    2011年1月4日 23:21
  • 挿入結果が ?? になっていることを、どのようにして確認されていますか? 確認方法に問題があって、表示時に ?? になっている可能性もあります。(SQL Server では、NVARCHAR のデータを VARCHAR で取り出すと、変換できない文字を ? にするので、確認方法に問題がある可能性があります)

    ストアドのパラメータが NVARCHAR で、挿入されたデータが ?? になっている場合、ストアドを呼び出す側が間違っていて、ストアドにわたってきた時点ですでに ?? になってしまっている可能性を疑うと良いかと思います。

    また、N-prefix は文字列定数を NVARCHAR で定義するものです。すでに NVARCHAR で受け取っている場合には必要ありません。イメージとしては、「VARCHAR を NVARCHAR に変換する」ようなものだと考えてください。ただし、定数用なので、パラメータや変数には使用できません。VARCHAR 型のパラメータや変数を NVARCHAR に変換するためには、CAST または CONVERT を使用します。今回の場合は、すでに引数を NVARCHAR で受け取っているので、そのような変換は必要ありません。

     

    • 回答としてマーク naru0112 2011年1月5日 5:20
    2011年1月4日 23:49
  • 返信ありがとうございます。

    『??』の確認方法は

    SQL SERVER Managementでテーブルから該当するデーブルをポイントし『テーブルを開く』で

    内容を表示させて確認しております。

    教えて頂いた情報ですと、引数としてNvarchar宣言してますので引数を渡す所を確認したいと思います。

    有益な情報ありがとうございます。

     

    2011年1月5日 0:12
  • 日本語版のSQL Serverであったとしても、既定のコードページはJapanese(コードページ932)でインストールされます。これはS-JISです。したがって、Nプレフィックスを付けなければS-JISとして扱われます。つまり、NVARCHARでパラメーターが定義してあったとしても、Nプレフィックスを付ける必要があります。経験はありませんが、英語版のSQL Serverの既定のコードページでは、日本語自体が文字化けするのではないでしょうか?
    どのような形でストアドプロシージャを実行されているのかわかりませんが、以下の形でストアドプロシージャを実行すればうまくいくと思います。

    exec ストアドプロシージャ N'文字列'

     #(追記)コードページ932は、正確にはS-JISを拡張したものです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/
    • 回答としてマーク naru0112 2011年1月5日 5:20
    • 編集済み trapemiya 2011年1月5日 7:05 追記
    2011年1月5日 0:55
  • SQL Server Management Studio のグリッド表示は、便利な機能ですが簡易的なものなので信頼しないほうがよいです。「日本語版 Windows で日本語環境にて、日本語を表示する」といった場合なら問題ありません。

    しかし、日本語環境で英数字や日本語以外の日本語環境で一般的でない文字列を表示する場合や、カレンダーが日本になってる状態の日付型の列とか、かなりいやな挙動をするので、「SELECT 文を作成」して「ファイル出力」等を利用して、できあがったファイルをきちんと対象の言語の文字列を扱えるツールで表示してみるべきです。
    # 日付型の扱いは不具合だろ、と思わなくもない...

    2011年1月5日 3:32
  • 回答ありがとうございます。

    詳しい環境ですが、

    OS:Windows Server 2005 英語版

    SQLサーバー:SQL Server 2005 英語版

    で運用しようとしております。

    最終的に表示したいのは、ハングル文字です。

    テスト環境としては、日本語OS、Sqlserver英語版で日本語でテストしております。

    規定のコードページというのはわかりませんでしたが、既定の言語は英語、検索順序では日本語・・になっています。

    テスト環境では『??』になる文字でもテーブルに追加出来てないので

    なにかしらストアドで発行するSQLのエラーではないかと思いそちらを調査しております。

    先の実行方法も含め検討していきたいと思います。

    回答して下さった方々ありがとうございました。

    また、何かありましたら御教授願います。

     

     

    2011年1月5日 5:20