sql >> Database >  >> RDS >> Sqlserver

Ontsnappen van gescheiden id's in SQL Server corrigeren zonder QUOTENAME . te gebruiken

Uw QuoteName functie moet de lengte controleren, omdat de functie T-SQL QUOTENAME de maximale lengte aangeeft die wordt geretourneerd. Uw voorbeeld gebruiken:

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

If QuoteName(identifier) langer is dan 258 tekens, wordt het stil afgekapt wanneer het wordt toegewezen aan @delimitedIdentifier . Wanneer dat gebeurt, opent u de mogelijkheid voor @delimitedIdentifier om op ongepaste wijze te ontsnappen.

Er is een MSDN-artikel door Bala Neerumalla, een "ontwikkelaar van beveiligingssoftware bij Microsoft", die het onderwerp nader toelicht. Het artikel bevat ook het dichtst bij wat ik heb gevonden "definitieve documentatie over het ontsnappen aan geciteerde identifiers in SQL Server":

Dit is de C#-code die ik momenteel gebruik:

/// <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. vraag over mysql-scheidingsteken

  2. SqlAlchemy (Postgres + Flask):Hoe meerdere kolommen optellen?

  3. Hoe het aantal rijen in sqlite te krijgen met Android?

  4. MySql-query voor lopende balanscorrectie