Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Правилно екраниране на разграничени идентификатори в SQL Server без използване на QUOTENAME

Вашето QuoteName трябва да провери дължината, тъй като функцията T-SQL QUOTENAME указва максималната дължина, която връща. Използвайки вашия пример:

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

Ако QuoteName(identifier) е по-дълъг от 258 знака, той ще бъде безшумно съкратен, когато бъде присвоен на @delimitedIdentifier . Когато това се случи, отваряте възможността за @delimitedIdentifier да бъдат избягани неправилно.

Има ан MSDN статия от Bala Neerumalla, „разработчик на софтуер за сигурност в Microsoft“, който обяснява темата по-задълбочено. Статията също така съдържа най-близкото нещо, което открих, до „окончателна документация за това как да избегнете идентификатори в кавички в SQL Server“:

Това е 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да промените таблицата в SQL Server с помощта на Alter Statement - SQL Server / T-SQL урок, част 35

  2. Проблем с групово вмъкване на редов терминатор

  3. Разлика между клъстериран и неклъстерен индекс

  4. Как да намеря последователни редове въз основа на стойността на колона?

  5. Как да намерите неизползвани таблици в SQL Server