Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

QUOTENAME का उपयोग किए बिना SQL सर्वर में सीमांकित पहचानकर्ताओं से बचने का सही तरीका

आपका QuoteName फ़ंक्शन को लंबाई की जांच करने की आवश्यकता होती है, क्योंकि T-SQL QUOTENAME फ़ंक्शन उसके द्वारा लौटाई गई अधिकतम लंबाई निर्दिष्ट करता है। अपने उदाहरण का उपयोग करना:

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

अगर QuoteName(identifier) 258 वर्णों से अधिक लंबा है, @delimitedIdentifier को असाइन किए जाने पर इसे चुपचाप छोटा कर दिया जाएगा . जब ऐसा होता है, तो आप @delimitedIdentifier . के लिए संभावना खोलते हैं अनुचित तरीके से बच निकलने के लिए।

एक है एमएसडीएन लेख बाला नीरुमल्ला द्वारा, "माइक्रोसॉफ्ट में सुरक्षा सॉफ्टवेयर डेवलपर", जो विषय को अधिक गहराई से समझाता है। लेख में "SQL सर्वर में उद्धृत पहचानकर्ताओं से बचने के तरीके के बारे में निश्चित दस्तावेज़ीकरण" के लिए सबसे नज़दीकी चीज़ भी शामिल है:

यह 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 सर्वर पीक प्रदर्शन सुनिश्चित करने के लिए 5 ट्रिक्स

  2. एकाधिक स्तंभों का औसत

  3. तालिका से सभी डेटा को एक सम्मिलित एसक्यूएल प्रारूप में कैसे निर्यात करें?

  4. SQL में एकाधिक वर्णों को कैसे बदलें?

  5. SQL सर्वर डेटाबेस (T-SQL उदाहरण) के लिए वर्तमान पंक्ति संस्करण मान कैसे लौटाएं