Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL Server存储过程中找到硬编码的英语字符串?_Sql_Sql Server 2005_Stored Procedures_Localization - Fatal编程技术网

如何在SQL Server存储过程中找到硬编码的英语字符串?

如何在SQL Server存储过程中找到硬编码的英语字符串?,sql,sql-server-2005,stored-procedures,localization,Sql,Sql Server 2005,Stored Procedures,Localization,我们正在努力使我们的应用程序100%本地化,而且我们基本上做到了。然而,我们偶尔会发现一个英文字符串仍然硬编码在存储过程中。(顺便说一句,我们使用的是SQLServer2005。)我们有数千个存储过程,因此手工处理它们是不现实的。我在想最准确的自动化搜索方法 现在,我知道没有办法搜索“English”字符串,但是搜索由单引号和20多个字符组成的字符串应该可以清除大部分字符串。对我们现在的目的来说已经足够了。但我预计存储过程的注释中也会出现很多误报 那么你将如何处理这个问题呢?SMO会让我将存储过

我们正在努力使我们的应用程序100%本地化,而且我们基本上做到了。然而,我们偶尔会发现一个英文字符串仍然硬编码在存储过程中。(顺便说一句,我们使用的是SQLServer2005。)我们有数千个存储过程,因此手工处理它们是不现实的。我在想最准确的自动化搜索方法

现在,我知道没有办法搜索“English”字符串,但是搜索由单引号和20多个字符组成的字符串应该可以清除大部分字符串。对我们现在的目的来说已经足够了。但我预计存储过程的注释中也会出现很多误报

那么你将如何处理这个问题呢?SMO会让我将存储过程中的SQL与其中的注释区分开来吗?我必须使用OBJECT_DEFINITION()并开始破解一些可怕的正则表达式吗


各位,我们提前表示感谢。

我们通过在不同的语言/区域设置中创建SQL Server并运行我们的sp解决了由此产生的问题,并注意哪些sp出现故障


这可能不是最优雅的解决方案,但由于我们支持的不同区域设置有限,因此我们能够快速完成。我们通过以不同语言/区域设置创建SQL Server并运行我们的sp解决了由此产生的问题,注意哪些服务器坏了


这可能不是最优雅的解决方案,但由于我们支持的不同位置设置有限,因此我们能够快速完成这项工作。

另一个想法:Microsoft通过Visual Studio提供了一个可以解析SQL的程序集。我已经用过了,而且使用起来相当简单。您可以使用它来解析存储过程的文本;它可以返回语句中各种标记的列表,包括标记的类型。因此,它应该能够帮助您区分您可能感兴趣的文本字符串和评论中可以忽略的部分。此处有更多详细信息:

基本上,从.NET打开到数据库的连接并查询syscomments以获取存储过程的文本。您将循环执行每个过程,并使用这些解析器对其进行解析。然后,您将使用Sql100ScriptGenerator从解析的文本中获取令牌,循环遍历令牌并查找类型为ASCII或Unicode字符串文本的令牌。对于这些字符串,检查它们的长度是否为20+,如果是,则将字符串和进程标记为需要进一步检查

我对它进行了一些研究,下面是一个非常原始的示例来说明基本原理:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using Microsoft.Data.Schema;
using Microsoft.Data.Schema.ScriptDom;
using Microsoft.Data.Schema.ScriptDom.Sql;

namespace FindHardCodedStrings
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection conn = new SqlConnection())
            {
                SqlConnectionStringBuilder bldr = new SqlConnectionStringBuilder();
                bldr.DataSource = "localhost\\sqlexpress";
                bldr.InitialCatalog = "msdb";
                bldr.IntegratedSecurity = true;

                conn.ConnectionString = bldr.ConnectionString;

                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.CommandText = "select [text] from syscomments";

                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                da.Fill(ds);

                TSql100Parser parser = new TSql100Parser(false);
                Sql100ScriptGenerator gen = new Sql100ScriptGenerator();
                gen.Options.SqlVersion = SqlVersion.Sql100;

                foreach (DataRow proc in ds.Tables[0].Rows)
                {
                    string txt = proc[0].ToString();
                    using (System.IO.TextReader sr = new System.IO.StringReader(txt))
                    {
                        IList<ParseError> errs;
                        IScriptFragment frag = parser.Parse(sr, out errs);

                        if (null == frag)
                            continue;

                        IList<TSqlParserToken> tokens = gen.GenerateTokens((TSqlFragment)frag);

                        foreach (TSqlParserToken token in tokens)
                        {
                            if (token.TokenType == TSqlTokenType.UnicodeStringLiteral || token.TokenType == TSqlTokenType.AsciiStringLiteral)
                            {
                                if (token.Text.Length >= 20)
                                    Console.WriteLine("String found: " + token.Text);
                            }
                        }
                    }
                }

            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
使用System.Data.SqlClient;
使用Microsoft.Data.Schema;
使用Microsoft.Data.Schema.ScriptDom;
使用Microsoft.Data.Schema.ScriptDom.Sql;
命名空间FindHardCodedString
{
班级计划
{
静态void Main(字符串[]参数)
{
使用(SqlConnection conn=newsqlconnection())
{
SqlConnectionStringBuilder bldr=新的SqlConnectionStringBuilder();
bldr.DataSource=“localhost\\sqlexpress”;
bldr.InitialCatalog=“msdb”;
bldr.IntegratedSecurity=true;
conn.ConnectionString=bldr.ConnectionString;
SqlCommand cmd=conn.CreateCommand();
cmd.CommandType=System.Data.CommandType.Text;
cmd.CommandText=“从syscomments中选择[text];
SqlDataAdapter da=新的SqlDataAdapter(cmd);
数据集ds=新数据集();
da.填充(ds);
TSql100Parser=新的TSql100Parser(false);
Sql100ScriptGenerator gen=新的Sql100ScriptGenerator();
gen.Options.SqlVersion=SqlVersion.Sql100;
foreach(ds.Tables[0].行中的DataRow进程)
{
字符串txt=proc[0].ToString();
使用(System.IO.TextReader sr=new System.IO.StringReader(txt))
{
IList错误;
IScriptFragment frag=parser.Parse(sr,out errs);
if(null==frag)
持续
IList令牌=gen.GenerateTokens((TSqlFragment)frag);
foreach(令牌中的TSqlParserToken令牌)
{
if(token.TokenType==TSQLTokeType.UnicodeStringLiteral | | | token.TokenType==TSQLTokeType.AsciiStringLiteral)
{
如果(token.Text.Length>=20)
Console.WriteLine(“找到的字符串:“+token.Text”);
}
}
}
}
}
}
}
}

另一个想法:Microsoft通过Visual Studio提供了一个可以解析SQL的程序集。我已经用过了,而且使用起来相当简单。您可以使用它来解析存储过程的文本;它可以返回语句中各种标记的列表,包括标记的类型。因此,它应该能够帮助您区分您可能感兴趣的文本字符串和评论中可以忽略的部分。此处有更多详细信息:

基本上,从.NET打开到数据库的连接并查询syscomments以获取存储过程的文本。您将循环执行每个过程,并使用这些解析器对其进行解析。然后,您将使用Sql100ScriptGenerator从解析的文本中获取令牌,循环遍历令牌并查找类型为ASCII或Unicode字符串文本的令牌。对于这些字符串,检查它们的长度是否为20+,以及是否为i