sql >> データベース >  >> RDS >> Sqlserver

QUOTENAMEを使用せずに、SQLServerで区切られた識別子を正しくエスケープする

    QuoteName T-SQL QUOTENAME関数は返す最大長を指定するため、関数は長さをチェックする必要があります。あなたの例を使用して:

    String.Format(@"declare @delimitedIdentifier nvarchar(258);
    set @delimitedIdentifier = {0};", QuoteName(identifier));
    

    QuoteName(identifier)の場合 が258文字より長い場合、@delimitedIdentifierに割り当てられるとサイレントに切り捨てられます 。その場合、@delimitedIdentifierの可能性が広がります。 不適切に脱出する。

    MSDNの記事 「Microsoftのセキュリティソフトウェア開発者」であるBalaNeerumallaによる、このトピックをより詳細に説明しています。この記事には、「SQLServerで引用符で囲まれた識別子をエスケープする方法に関する最も信頼のおけるドキュメント」に最も近いものも含まれています。

    これは私が現在使用しているC#コードです:

    /// <summary>
    /// Returns a string with the delimiters added to make the input string
    /// a valid SQL Server delimited identifier. Brackets are used as the
    /// delimiter. Unlike the T-SQL version, an ArgumentException is thrown
    /// instead of returning a null for invalid arguments.
    /// </summary>
    /// <param name="name">sysname, limited to 128 characters.</param>
    /// <returns>An escaped identifier, no longer than 258 characters.</returns>
    public static string QuoteName(string name) { return QuoteName(name, '['); }
    
    /// <summary>
    /// Returns a string with the delimiters added to make the input string
    /// a valid SQL Server delimited identifier. Unlike the T-SQL version,
    /// an ArgumentException is thrown instead of returning a null for
    /// invalid arguments.
    /// </summary>
    /// <param name="name">sysname, limited to 128 characters.</param>
    /// <param name="quoteCharacter">Can be a single quotation mark ( ' ), a
    /// left or right bracket ( [] ), or a double quotation mark ( " ).</param>
    /// <returns>An escaped identifier, no longer than 258 characters.</returns>
    public static string QuoteName(string name, char quoteCharacter) {
        name = name ?? String.Empty;
        const int sysnameLength = 128;
        if (name.Length > sysnameLength) {
            throw new ArgumentException(String.Format(
                "name is longer than {0} characters", sysnameLength));
        }
        switch (quoteCharacter) {
            case '\'':
                return String.Format("'{0}'", name.Replace("'", "''"));
            case '"':
                return String.Format("\"{0}\"", name.Replace("\"", "\"\""));
            case '[':
            case ']':
                return String.Format("[{0}]", name.Replace("]", "]]"));
            default:
                throw new ArgumentException(
                    "quoteCharacter must be one of: ', \", [, or ]");
        }
    }
    


    1. 1つ以上のオブジェクトがこの列にアクセスするため、ALTER TABLEDROPCOLUMNが失敗しました

    2. エラー-ORA-22835:バッファが小さすぎてCLOBからCHARまたはBLOBからRAWに変換できません

    3. ダンプファイルMySQL5.6.10

    4. データベース列のビットフラグに不利な点はありますか?