web-dev-qa-db-ja.com

「CONCAT」は認識されている組み込み関数名ではありません

クライアントから、SQL Server 2012で実行されているとの報告がありましたが、最終的に配信する前に、テスト用のテストクエリをいくつか配信しました。

'CONCAT'は、認識されている組み込み関数名ではありません。

CONCAT()はSQL Server 2012で導入された新しい組み込み関数であることを理解していますが、これはすべて問題なく機能しますが、変更をロールバックして、この2008R2を互換性を持たせるために「クエリを実行しているユーザーには、実行するTransact-SQL権限がない可能性があります。」つまり、クライアントには、PRODとは異なるバージョンのSQL ServerがDEVにインストールされている可能性が高いということを証明しています。

組み込みスカラー値関数のSELECT/EXECUTE権限を具体的に拒否することに関する情報は見つかりませんが、それは可能ですか?それでもユーザーは同じエラーテキストを受け取りますか?

27
beeks

CONCATはSQL Server 2012で導入されました。 SQL Server 2008 R2で機能させる方法はありません。 ドキュメント から:

enter image description here

また、互換性レベルがあっても、それを2012+で失敗させる方法はありません。したがって、両方のサーバーで_SELECT @@VERSION;_をチェックしてもらいます。 CONCATが失敗する場所は<11です。コードを以前のバージョンと互換性を持たせるには、標準の文字列連結演算子(_+_)を使用する必要があります。 exact同じ数の入力文字列を常に使用しない限り、これをスカラー関数でどのように実行するかわかりませんandコードを変更しますdbo.CONCAT()の代わりにCONCAT()を使用する(重要なシナリオがあり、さらに、ネイティブが行わないことを関数が実行する場合は、アップグレードした場合/アップグレード時に一貫した動作が必要です) 。したがって、私はそのアプローチをお勧めしません。 NULLの処理やその他の小さな変更を追加する必要がある場合もあります(既存のスクリプトを正確に変更する方法がわからない場合は、変更することはできません)。

21
Aaron Bertrand

次のようにODBC CONCAT関数を使用できます。

SELECT {fn CONCAT('foo ', 'test') }

この問題は、この関数では一度に2つのパラメーターしか使用できないことです。したがって、次のように2つ以上使用する場合を除きます。

SELECT {fn CONCAT('foo ', {fn CONCAT('test ', 'buddy')}) }

「+」演算子を使用することもできます。

4
bfs