Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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
C# SQL Server中CLR存储过程的性能_C#_Sql_Sql Server_Stored Procedures_Sqlclr - Fatal编程技术网

C# SQL Server中CLR存储过程的性能

C# SQL Server中CLR存储过程的性能,c#,sql,sql-server,stored-procedures,sqlclr,C#,Sql,Sql Server,Stored Procedures,Sqlclr,我有一个SQL CLR存储过程,它解析TLVBER字符串,每次向DB发送命令时,都会调用此CLR过程,共有6个命令 这6个命令表示一个事务 在每个接收TLVBER字符串的命令中,我将该字符串解析为标记及其值,然后将其插入或更新到相应的列/表中。重要的是,这个标签存在于数据库中,我通过一个查询来验证它 要知道在哪个列/表中插入或更新了标记,我在DB中有一个表,我在其中存储id\u标记、表和列 问题是: 我不知道什么是更好的选择,因为我已经在CLR中编码了整个过程,我做了许多查询、插入和更新 举个例

我有一个SQL CLR存储过程,它解析TLVBER字符串,每次向DB发送命令时,都会调用此CLR过程,共有6个命令

这6个命令表示一个事务

在每个接收TLVBER字符串的命令中,我将该字符串解析为标记及其值,然后将其插入或更新到相应的列/表中。重要的是,这个标签存在于数据库中,我通过一个查询来验证它

要知道在哪个列/表中插入或更新了标记,我在DB中有一个表,我在其中存储
id\u标记
、表和列

问题是:

我不知道什么是更好的选择,因为我已经在CLR中编码了整个过程,我做了许多查询、插入和更新

举个例子,有一个问题是我必须创建一个临时表,我读到这不是推荐的,所以我用CLR解决这个问题,因为你可以使用ArrayList;总的来说,从C#编写代码比从T-SQL编写代码更容易

另一方面,我想在一个表中插入所有标记,然后 使用id引用这些标记,因为如果我将所有标记存储在一个 表中,我将存储发送到数据库的所有不同命令的标记

处理时间至关重要,因为每分钟将有数千个事务

在CLR中,我必须从DB查询数据(这些查询是否会影响CLR的时间进程?)

下一个问题是TLVBER解析的末尾,因为我需要连接解析的结果,比较解析的每个标记(每个标记用ArrayList迭代),并查询插入或更新的表/列。 我认为最好是构建查询,将其作为表返回到T-SQL,这样在T-SQL中的执行速度会比在CLR中更快

无论如何,我必须对数据库进行许多查询以获取信息,所以有没有办法将表发送到CLR SP?;为了避免从CLR进行查询,最好在T-SQL中查询必要的数据,并将其发送到CLR,这样可以处理数据,并且不会与DB进行任何交互(没有产生延迟的连接,只处理数据)

下面的代码向您展示了如何从T-SQL调用CLR,然后我向您展示了循环,在这里我进行查询、插入和更新

EXEC SP_CLR_PARSEATLVBER @TLV= '00102001010010010100100201007F010101',
                     @error=@ERRORCLR OUTPUT,
                     @CMD='OPN'

while (cursor <= total)
        {
            Stag = "";
            // -- * ******************EXTRAE TAG*******************
            tag = TLV.ToString().ToCharArray(cursor, 4);
            foreach (char c in tag)
                Stag = Stag + c;
            Stag = "0x" + Stag;
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                     " ('PARSEATLVBER', " +
                                     " '" + "TAG:" + Stag + "'," +
                                     " '128'," +
                                     " SYSDATETIME()" +
                                     " )";
            InsertaLog.ExecuteNonQuery();
            SeleccionaTag.CommandText = "SELECT id_tag FROM dbo.tags where dbo.tags.id_tag = '" + Stag + "'";
            SeleccionaTag.Connection = conn;
            reader = SeleccionaTag.ExecuteReader();
            int vacio = 0;
            String id_tag = "";
            while (reader.Read())
            {
                vacio++;
                id_tag = reader.GetSqlString(0).ToString();
            }
            reader.Close();
            if (vacio == 0)
            {
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'ID_TAG NO SE ENCUENTRA'," +
                                   " '137'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
            }
            {
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                         " ('PARSEATLVBER', " +
                                         " '" + "Vacio:" + id_tag + "'," +
                                         " '137'," +
                                         " SYSDATETIME()" +
                                         " )";
                InsertaLog.ExecuteNonQuery();
            }             


            //-- /////////////////////////////////////



            //     --*******************AVANCE EN LA CADENA*******************
            cursor = cursor + 4;
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                     " ('PARSEATLVBER', " +
                                     " 'Cursor despues de extraer tag(" + Stag + "): " + cursor.ToString() + "'," +
                                     " '137'," +
                                     " SYSDATETIME()" +
                                     " )";
            InsertaLog.ExecuteNonQuery();
            //       -- /////////////////////////////////////
            //  --*******************EXTRAE TAMAÑO EN BYTES DEL TAG EXTRAIDO *******************
            length = TLV.ToString().ToCharArray(cursor,  2);
            Slength = "";
            foreach (char c in length)
                Slength = Slength + c;
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'TAMAÑO DE TAG:" + Slength + "'," +
                                   " '209'," +
                                   " SYSDATETIME()" +
                                   " )";
            Int32.TryParse( Slength, NumberStyles.HexNumber,
                                new CultureInfo("en-US"), out varlength);
            InsertaLog.ExecuteNonQuery();
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'TAMAÑO DE TAG(INT):" + varlength.ToString() + "'," +
                                   " '218'," +
                                   " SYSDATETIME()" +
                                   " )";
            InsertaLog.ExecuteNonQuery();
            Slength = "";
            if ((varlength) > 127)
            {
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   "'TAG SUPERA LONGITUD'," +
                                   " '227'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
                varlength = 0;
               //  --*******************AVANCE EN LA CADENA*******************
               cursor = cursor + 2;
               InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                         " ('PARSEATLVBER', " +
                                         " 'Cursor despues de extraer tamaño de TAG(" + tag + "):" +cursor+ "'," +
                                         " '237'," +
                                         " SYSDATETIME()" +
                                         " )";
                InsertaLog.ExecuteNonQuery();
                // -- /////////////////////////////////////
                TotalBytes = varlength - 128;
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'Total de Bytes Asignados de la longitud del TAG(" + tag + "):" + TotalBytes+"',"+
                                   " '246'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
                length = TLV.ToString().ToCharArray(cursor,  2);
               foreach (char c in length)
                    Slength = Slength + c;
               InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'TAMAÑO DE TAG:" + Slength + "'," +
                                   " '257'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
                Int32.TryParse(Slength, NumberStyles.HexNumber,
                                new CultureInfo("en-US"), out varlength);
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                       " ('PARSEATLVBER', " +
                                       " 'TAMAÑO DE TAG(INT):" + varlength.ToString() + "'," +
                                       " '266'," +
                                       " SYSDATETIME()" +
                                       " )";
                InsertaLog.ExecuteNonQuery();
                varlength = varlength * 2;
               //--*******************AVANCE EN LA CADENA*******************
               cursor = cursor + (TotalBytes * 2);
               // -- /////////////////////////////////////
            }
            else
            {
                length = TLV.ToString().ToCharArray(cursor, 2);
                Slength = "";
                foreach (char c in length)
                    Slength = Slength + c;
                Int32.TryParse(Slength, NumberStyles.HexNumber,
                                new CultureInfo("en-US"), out varlength);
                //--*******************AVANCE EN LA CADENA*******************
                cursor = cursor + 2;
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'Slength:" + Slength + "'," +
                                   " '286'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
                InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'TAMAÑO DE TAG(INT):" + varlength.ToString() + "'," +
                                   " '294'," +
                                   " SYSDATETIME()" +
                                   " )";
                InsertaLog.ExecuteNonQuery();
                // -- /////////////////////////////////////
            }
            //-- /////////////////////////////////////
            //-- * ******************EXTRAE VALOR DE TAG EXTRAIDO *******************
            value = TLV.ToString().ToCharArray(cursor, varlength);
            foreach (char c in value)
                Svalue = Svalue + c;
            SeleccionaTipoDato.CommandText = "SELECT dbo.TAGS.tipodato" +
                                             "  FROM dbo.TAGS" +
                                             " WHERE dbo.TAGS.id_tag = '" + tag + "'";
            SeleccionaTipoDato.Connection = conn;
            reader = SeleccionaTipoDato.ExecuteReader();
            while (reader.Read())
            {
                tipoDato = reader.GetSqlString(0).ToString();
            }
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                   " ('PARSEATLVBER', " +
                                   " 'TipoDato:" + tipoDato.ToString() + "'," +
                                   " '294'," +
                                   " SYSDATETIME()" +
                                   " )";
            InsertaLog.ExecuteNonQuery();
            reader.Close();
            if (tipoDato.Equals("ASCII"))
            {
                Convertidor C = new Convertidor();
                valorParseadoASCII=C.ValueToASCII(Svalue);
            }
            cursor = cursor + varlength;
            //-- /////////////////////////////////////
            //-- ******************* Tabla para agregar tags con su respectivo valor *******************
            Tupla.Add(Stag);
            Tupla.Add(Svalue);
            if(tag.Equals("0x2005"))
                 TID = Svalue;
            if(tag.Equals("0x1003"))
                 MID = Svalue;
            if (tag.Equals("0xE001"))
                xid = Convert.ToInt64(Svalue);
            CMD.Add(Tupla);
            InsertaLog.CommandText = "INSERT INTO DBO.LOGDB values " +
                                       " ('PARSEATLVBER', " +
                                       " 'Tupla Agregada: (" + Tupla[0]+","+Tupla[1] + ")'," +
                                       " '320'," +
                                       " SYSDATETIME()" +
                                       " )";
            InsertaLog.ExecuteNonQuery();
            Tupla.Clear();
            Svalue =  "";
            Slength = "";
            Stag = "";
            //-- /////////////////////////////////////
    }
        // INSERCION DE CAMPO LLAVE 
        if (cmd.Equals("OPN"))
        {
            SeleccionaNuevaLLave.CommandText =    "SELECT NEXT VALUE FOR dbo.llave";
            reader = SeleccionaNuevaLLave.ExecuteReader();
            while (reader.Read())
                  SecuenciaLlave = Convert.ToInt64(reader.GetSqlString(0));
            reader = SeleccionaNuevaLLave.ExecuteReader();
            SeleccionaNuevaTransId.CommandText = "SELECT NEXT VALUE FOR dbo.transid";
            while (reader.Read())
                SecuenciaTransid = Convert.ToInt64(reader.GetSqlString(0));
            InsertaNuevaTransaccion.CommandText = "INSERT INTO dbo.transaccion"+
                                                  " values (xid,trans_id,mid,tid)" +
                                                  " ("+SecuenciaLlave   + "," +
                                                       SecuenciaTransid + "," +
                                                       MID              + "," +
                                                       TID              +
                                                  " )";
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.AMT (xid) values (" + SecuenciaLlave  +")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.CRD (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.DMO (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.HST (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.MRC (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.PRO (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.RCV (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
            InsertaNuevaTransaccion.CommandText = "INSERT INTO DBO.SND (xid) values (" + SecuenciaLlave + ")"; InsertaNuevaTransaccion.ExecuteNonQuery();
        }
        else
        {
            SecuenciaLlave = xid;
        }

        int j = 0;
        String tabla,columna;
        foreach (ArrayList A in CMD)
        {
            SeleccionaTipoDato.CommandText = "SELECT  dbo.TAGS.tabla,"+
                                                    " dbo.TAGS.columna" +
                                             "  FROM  dbo.TAGS" +
                                             " WHERE  dbo.TAGS.id_tag = '" + A[0].ToString() + "'";
            reader = SeleccionaTipoDato.ExecuteReader();
            while (reader.Read())
            {
                tabla = reader.GetSqlString(0).ToString();
                columna = reader.GetSqlString(1).ToString();
                ActualizaTabla.CommandText = "UPDATE "
                                             +tabla+
                                             " SET " 
                                             +columna+"='"+A[1]+"'"+
                                             " where "+tabla+".xid="+SecuenciaLlave;
                ActualizaTabla.ExecuteNonQuery();
            }
        }
EXEC SP_CLR_PARSEATLVBER@TLV='00102000101001010010021007F010101',
@error=@ERRORCLR输出,
@CMD='OPN'
while(光标127)
{
InsertaLog.CommandText=“插入DBO.LOGDB值”+
('PARSEATLVBER',”+
“‘标记SUPERA LONGITUD’,”+
" '227'," +
“SYSDATETIME()”+
" )";
InsertaLog.ExecuteNonQuery();
varlength=0;
//——******************卡德纳先锋酒店*******************
游标=游标+2;
InsertaLog.CommandText=“插入DBO.LOGDB值”+
('PARSEATLVBER',”+
“'光标移动到标记(“+TAG+”):“+Cursor+”,”+
" '237'," +
“SYSDATETIME()”+
" )";
InsertaLog.ExecuteNonQuery();
// -- /////////////////////////////////////
TotalBytes=varlength-128;
InsertaLog.CommandText=“插入DBO.LOGDB值”+
('PARSEATLVBER',”+
“'Total de Bytes Asignados de la longitud del TAG(“+TAG+”):“+TotalBytes+”,”+
" '246'," +
“SYSDATETIME()”+
" )";
InsertaLog.ExecuteNonQuery();
长度=TLV.ToString().toCharray(光标,2);
foreach(字符长度为c)
Slength=Slength+c;
InsertaLog.CommandText=“插入DBO.LOGDB值”+
('PARSEATLVBER',”+
“TAMAñO DE TAG:+Slength+”+
" '257'," +
“SYSDATETIME()”+
" )";
InsertaLog.ExecuteNonQuery();
Int32.TryParse(长度,数字样式,十六进制数字,
新文化信息(“en-US”),长度不限;
InsertaLog.CommandText=“插入DBO.LOGDB值”+
('PARSEATLVBER',”+
“'TAMAñO DE TAG(INT):“+varlength.ToString()+”,”+
" '266'," +
“SYSDATETIME()”+
" )";
InsertaLog.ExecuteNonQuery();
varlength=varlength*2;
//--*******************卡德纳先锋酒店*******************
游标=游标+(总字节数*2);
// -- /////////////////////////////////////
}
其他的
{
长度=TLV.ToString().toCharray(光标,2);
Slength=“”;
foreach(字符长度为c)
Slength=Slength+c;
Int32.TryParse(长度,数字样式,十六进制数字,
新文化信息(“en-US”),长度不限;
//--*******************卡德纳先锋酒店*******************
游标=游标+2;