' CONCAT 'は認識された組み込み関数名ではありません
On 2月 17, 2021 by adminクライアントがSQLServer 2012で実行されていると報告しましたが、最終的な配信の前にテスト用のテストクエリをいくつか配信しました:
” CONCAT “は認識された組み込み関数名ではありません。
CONCAT()
が新しく構築されたものであることを理解しています-SQL Server 2012で導入された機能で、これはすべて問題ありませんが、「クエリを実行するユーザーにはTransact-SQLの実行権限がない可能性がある」という名目で、この2008R2と互換性を持たせるために変更をロールバックするように求められました。 。」したがって、クライアントのDEVには、PRODとは異なるバージョンのSQLServerがインストールされている可能性が高いという私の主張を証明しています。
組み込みのスカラー値関数のアクセス許可ですが、それは可能ですか。その場合でも、ユーザーは同じエラーテキストを受け取りますか?
コメント
回答
CONCAT
が導入されましたSQL Server2012の場合。SQLServer2008R2で機能させる方法はありません。ドキュメントから:
互換性レベルがあっても、2012以降で失敗させる方法はありません。したがって、両方のサーバーでSELECT @@VERSION;
を確認してもらいます。 CONCAT
が失敗した場合は<であることがわかります。11。コードを以前のバージョンと互換性を持たせるには、次のことが必要です。標準の文字列連結演算子(+
)を使用します。常に正確な同じ数の入力文字列と CONCAT()
の代わりにdbo.CONCAT()
を使用するようにコードを変更します(さらに重要なシナリオがあります関数がネイティブが実行しないことを実行する場合、アップグレードする場合は一貫した動作が必要です)。したがって、そのアプローチはお勧めしません。NULL
の処理やその他の小さな変更を追加する必要がある場合もあります(できない場合は、既存のスクリプトを正確に変更する方法を説明できません)。参照してください。
コメント
- ありがとう、アーロン。 CONCAT()は、SP_ExecuteSQL動的SQL呼び出しの前にいくつかの文字列を結合するために使用されるため、コードを変更するのは簡単です。 SQL Server 2012でCONCAT()を使用するアクセスを拒否する方法がないことを確認したかっただけです
- @beeks私は'何も知りませんユーザーが
CONCAT()
を使用することを拒否する方法はありません。ただし、'は、2008R2でコードを機能させるために必要なこととの関係を完全には理解していません。追加するのではなく、削除CONCAT()
する必要があります。 - はい、コードを2008R2と互換性のあるものにする方法を理解しています。些細なことです。この関数に
DENY
アクセスできないことを確認していただきありがとうございます。 - 連結を+ you ' llは、連結される値が最初から文字列であることを確認する必要があります。数値フィールドがある場合は、それらを追加しようとします(文字列は整数ではないため失敗します)。したがって、数値フィールド(タイプ)がある場合は、必ず最初に文字列に変換/キャストしてください
回答
ODBCCONCAT関数は次のように使用できます:
SELECT {fn CONCAT("foo ", "test") }
これに関する問題は、この関数では2つのパラメーターしか使用できないことです。一度に。したがって、次のように3つ以上を使用する場合を除きます。
SELECT {fn CONCAT("foo ", {fn CONCAT("test ", "buddy")}) }
また、「+」演算子を使用するだけです。
SELECT (c.FirstName+','+c.LastName) AS FULLNAME FROM graduatejob c;
DECLARE @msg VARCHAR(200) = 'Shrink file completed. Target Size: ' + @TargetSize + ' MB. Timestamp: ' + CURRENT_TIMESTAMP;