Easy way to convert exec sp_executesql to a normal query?

后端 未结 10 1275
一整个雨季
一整个雨季 2021-01-31 09:37

When dealing with debugging queries using Profiler and SSMS, its pretty common for me to copy a query from Profiler and test them in SSMS. Because I use parameterized sql, my q

10条回答
  •  醉酒成梦
    2021-01-31 10:03

    I was looking for something similar so I use this in LinqPad, just copy sp_executesql statement to the clipboard and run the code in LinqPad. It outputs the SQL statement.

    void Main()
    {
        ConvertSql(System.Windows.Forms.Clipboard.GetText()).Dump();
    }
    
    private static string ConvertSql(string origSql)
    {
      string tmp = origSql.Replace("''", "~~");       
      string baseSql;
      string paramTypes;
      string paramData = "";
      int i0 = tmp.IndexOf("'") + 1;
      int i1 = tmp.IndexOf("'", i0);
      if (i1 > 0)
      {
          baseSql = tmp.Substring(i0, i1 - i0); 
          i0 = tmp.IndexOf("'", i1 + 1);
          i1 = tmp.IndexOf("'", i0 + 1);
          if (i0 > 0 && i1 > 0)
          {
              paramTypes = tmp.Substring(i0 + 1, i1 - i0 - 1);
              paramData = tmp.Substring(i1 + 1);
          }
      }
      else
      {
          throw new Exception("Cannot identify SQL statement in first parameter");
      }
    
      baseSql = baseSql.Replace("~~", "'");  
      if (!String.IsNullOrEmpty(paramData))  
      {
          string[] paramList = paramData.Split(",".ToCharArray());
          foreach (string paramValue in paramList)
          {
              int iEq = paramValue.IndexOf("=");
              if (iEq < 0)
                  continue;
              string pName = paramValue.Substring(0, iEq).Trim();
              string pVal = paramValue.Substring(iEq + 1).Trim();
              baseSql = baseSql.ReplaceWholeWord(pName, pVal);
          }
      }
    
      return baseSql;
    }
    
    public static class StringExtensionsMethods
    {
       /// 
       /// Replaces the whole word.
       /// 
       /// The s.
       /// The word.
       /// The replacement.
       /// String.
       public static String ReplaceWholeWord(this String s, String word, String replacement)
       {
           var firstLetter = word[0];
           var sb = new StringBuilder();
           var previousWasLetterOrDigit = false;
           var i = 0;
           while (i < s.Length - word.Length + 1)
           {
               var wordFound = false;
               var c = s[i];
               if (c == firstLetter)
                   if (!previousWasLetterOrDigit)
                       if (s.Substring(i, word.Length).Equals(word))
                       {
                           wordFound = true;
                           var wholeWordFound = true;
                           if (s.Length > i + word.Length)
                           {
                               if (Char.IsLetterOrDigit(s[i + word.Length]))
                                   wholeWordFound = false;
                           }
    
                           sb.Append(wholeWordFound ? replacement : word);
    
                           i += word.Length;
                       }
    
               if (wordFound) continue;
    
               previousWasLetterOrDigit = Char.IsLetterOrDigit(c);
               sb.Append(c);
               i++;
           }
    
           if (s.Length - i > 0)
               sb.Append(s.Substring(i));
    
           return sb.ToString();
       }
    }
    

提交回复
热议问题