api-sqlserver2008 调用dbsqlexec() 返回慢 耗时

问题描述

sqlserver2008 调用dbsqlexec() 返回慢 耗时

经常出现调用此api后一秒甚至更长时间才返回的情况,有人知道是什么问题吗???

我的sql语句就只有一句最简单的“select 1",调用dbsqlexec() 居然经常要1秒后才返回
程序和数据库在同一台机器上面;操作系统是server2008 R2;直接用sql server management studio上面测试过万次,最多也只要16ms,而且也只是偶尔出现;

解决方案

第一种:使用Sql Server函数:

1.将数据组合成字串,使用函数将数据插入内存表,后将内存表数据复制到要插入的表。

2.组合成的字符换格式:'111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|2222|3333|456,7894,7458|0|1|2014-01-01 12:15:16',每行数据中间用“;”隔开,每个字段之间用“|”隔开。

3.编写函数:

CREATE FUNCTION [dbo].fun_funcname,@splitchar CHAR(1),@splitchar2 CHAR(1))
--定义返回表

RETURNS @t TABLE(MaxValue float,Phase int,SlopeValue float,Data varchar(600),Alarm int,AlmLev int,GpsTime datetime,UpdateTime datetime) AS

/*

author:hejun li

create date:2014-06-09

*/

BEGIN

DECLARE @substr VARCHAR(max),@substr2 VARCHAR(max)
--申明单个接收值
declare @MaxValue float,@Phase int,@SlopeValue float,@Data varchar(8000),@Alarm int,@AlmLev int,@GpsTime datetime
SET @substr=@str

DECLARE @i INT,@j INT,@ii INT,@jj INT,@ijj1 int,@ijj2 int,@m int,@mm int

SET @j=LEN(REPLACE(@str,@splitchar,REPLICATE(@splitchar,2)))-LEN(@str)--获取分割符个数

IF @j=0

BEGIN

--INSERT INTO @t VALUES (@substr,1) --没有分割符则插入整个字串

set @substr2=@substr;
set @ii=0
SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数
WHILE @ii<=@jj
BEGIN
if(@ii<@jj)
begin
SET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前一位置

                        if(@ii=0)
                            set @MaxValue=cast(LEFT(@substr2,@mm) as float)
                        else if(@ii=1)
                            set @Phase=cast(LEFT(@substr2,@mm) as int)
                        else if(@ii=2)
                            set @SlopeValue=cast(LEFT(@substr2,@mm) as float)
                        else if(@ii=3)
                            set @Data=cast(LEFT(@substr2,@mm) as varchar)
                        else if(@ii=4)
                            set @Alarm=cast(LEFT(@substr2,@mm) as int)
                        else if(@ii=5)
                            set @AlmLev=cast(LEFT(@substr2,@mm) as int)
                        else if(@ii=6)
                            INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

                        SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串
                    end
                else
                    BEGIN
                        --当循环到最后一个值时将数据插入表
                        INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

                    END
            --END
            SET @ii=@ii+1
        END
END

ELSE

BEGIN

SET @i=0

WHILE @i<=@j

BEGIN

IF(@i<@j)

BEGIN

SET @m=CHARINDEX(@splitchar,@substr)-1 --获取分割符的前一位置

--INSERT INTO @t VALUES(LEFT(@substr,@m),@i+1)
-----二次循环开始
--1.线获取要二次截取的字串
set @substr2=(LEFT(@substr,@m));
--2.初始化二次截取的起始位置
set @ii=0
--3.获取分隔符个数
SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数
WHILE  @ii<=@jj
    BEGIN
        if(@ii<@jj)
            begin
                SET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前一位置

                if(@ii=0)
                    set @MaxValue=cast(LEFT(@substr2,@mm) as float)
                else if(@ii=1)
                    set @Phase=cast(LEFT(@substr2,@mm) as int)
                else if(@ii=2)
                    set @SlopeValue=cast(LEFT(@substr2,@mm) as float)
                else if(@ii=3)
                    set @Data=cast(LEFT(@substr2,@mm) as varchar)
                else if(@ii=4)
                    set @Alarm=cast(LEFT(@substr2,@mm) as int)
                else if(@ii=5)
                    set @AlmLev=cast(LEFT(@substr2,@mm) as int)
                else if(@ii=6)
                    INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

                SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串
            end
        else
            BEGIN
                --当循环到最后一个值时将数据插入表
                INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

            END
    --END
    SET @ii=@ii+1
END
-----二次循环结束
SET @substr=RIGHT(@substr,LEN(@substr)-(@m+1)) --去除已获取的分割串,得到还需要继续分割的字符串

END

ELSE

BEGIN
--INSERT INTO @t VALUES(@substr,@i+1)--对最后一个被分割的串进行单独处理
-----二次循环开始
--1.线获取要二次截取的字串
set @substr2=@substr;
--2.初始化二次截取的起始位置
set @ii=0
--3.获取分隔符个数
SET @jj=LEN(REPLACE(@substr2,@splitchar2,REPLICATE(@splitchar2,2)))-LEN(@substr2)--获取分割符个数
WHILE @ii<=@jj
BEGIN
if(@ii<@jj)
begin
SET @mm=CHARINDEX(@splitchar2,@substr2)-1 --获取分割符的前一位置
if(@ii=0)
set @MaxValue=cast(LEFT(@substr2,@mm) as float)
else if(@ii=1)
set @Phase=cast(LEFT(@substr2,@mm) as int)
else if(@ii=2)
set @SlopeValue=cast(LEFT(@substr2,@mm) as float)
else if(@ii=3)
set @Data=cast(LEFT(@substr2,@mm) as varchar)
else if(@ii=4)
set @Alarm=cast(LEFT(@substr2,@mm) as int)
else if(@ii=5)
set @AlmLev=cast(LEFT(@substr2,@mm) as int)
else if(@ii=6)
INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

                SET @substr2=RIGHT(@substr2,LEN(@substr2)-(@mm+1)) --去除已获取的分割串,得到还需要继续分割的字符串
            end
        else
            BEGIN
                --当循环到最后一个值时将数据插入表
                INSERT INTO @t VALUES(@MaxValue,@Phase,@SlopeValue,''+@Data+'',@Alarm,@AlmLev,cast(@substr2 as datetime),GETDATE())

            END
    SET @ii=@ii+1
END
-----二次循环结束

END

SET @i=@i+1

END

END

RETURN

END

时间: 2024-10-30 19:41:23

api-sqlserver2008 调用dbsqlexec() 返回慢 耗时的相关文章

开发流程- 公司要与其他网站合作,要求开发api接口,供合作方调用,返回的数据是json或xml格式的

问题描述 公司要与其他网站合作,要求开发api接口,供合作方调用,返回的数据是json或xml格式的 请问这个开发流程大概是怎样的?求解..................................................... 解决方案 asp.net webapi非常适合做这个,你只要按照你原来的方式编写函数调用,它会自动将提交的数据转换成对象,作为参数传入,以及传出的参数转换成json返回. 解决方案二: 不管你后台用.net还是java还是php,你只需要公布一个可以访问的

调用 RESTful API 创建聊天组返回 500 错误码

问题描述 调用 RESTful API 创建聊天组返回 500 错误,请帮忙给看看什么问题,谢谢.之前一直好好的,今天下午发现这样的错误比较多. ERROR - 2016-04-05 16:19:57 --> EaseMobClient: Reponse code not 200 while call easemob service : 500ERROR - 2016-04-05 16:19:57 --> EaseMobClient: Reponse content from easemob

api-调用亚马逊API 实现上传返回错误

问题描述 调用亚马逊API 实现上传返回错误 接收的错误提示为:{"logref":"e61bbc01-ad59-11e5-907f-b7e029289a9e","message":"Account not found","code":"ACCOUNT_NOT_FOUND"} 哪位大神知道什么原因吗 解决方案 你的账号有问题 没有通过验证 解决方案二: 已解决,亚马逊需要获得Endpoi

uri-android 调用录音机返回的Uri是file:///开头的?

问题描述 android 调用录音机返回的Uri是file:///开头的? 这也是Uri?还是什么?使用contentResolver()查询不到目标信息啊?不懂.... 还有想知道调用相机时不放extra参数,图片会在返回的intent中的一个名为data的extra中.这个data的名字是哪里查来的?我在android官方api中没找到啊?求指教.... 解决方案 只需替换file头即能获取绝对路径 解决方案二: 本地的文件是file开头的 解决方案三: if (data != null &

用Java实现全国天气预报的api接口调用示例_java

step1:选择本文所示例的接口"全国天气预报接口" 聚合数据url:http://www.juhe.cn/docs/api/id/39/aid/87 step2:每个接口都需要传入一个参数key,相当于用户的令牌,所以第一步你需要申请一个key. step3:学过java的同学们都知道,当我们对一个类或者方法不明白其意图和思想时,我们可以去查看文档,这里也不例外,而且对于英文不是特别好的同学来说很幸运的是,聚合网站上的文档都是中文版本的,比起阅读java源码里的英文文档应该轻松很多.

h3c-H3C CAS搭建的云API怎么调用

问题描述 H3C CAS搭建的云API怎么调用 用的工具是火狐的restclient,以http://服务器IP:服务器端口/v3/auth/tokens 消息体是用户名和密码进行post时,得不到令牌,返回的是空,服务器没有反应,好奇怪

xml-携程api接口请求成功返回的String数据怎样拿来使用

问题描述 携程api接口请求成功返回的String数据怎样拿来使用 携程官网提供的java方法,配置好后,请求成功,返回的是xml形式的一串String类型的字符串,怎么才能拿来使用? 解决方案 用xml解析库,或者反序列化成对象后就可以用了. 解决方案二: 用xml解析库,或者反序列化成对象后就可以用了. 解决方案三: google java xml解析.http://bbs.csdn.net/topics/290027113 http://developer.51cto.com/art/20

php调用存储过程返回结果集

php调用存储过程返回结果集,解决can't return a result set in the given context错误的方法需要php调用存储过程,返回一个结果集,发现很困难,找了半天,终于在老外的论坛上找到解决方案,这里本地化一下. 关键就是两点 1)define('CLIENT_MULTI_RESULTS', 131072); 2)$link = mysql_connect("127.0.0.1", "root", "",1,CL

有没有api可以调用使通知区域显示此应用程序的图标

问题描述 有没有api可以调用使通知区域显示此应用程序的图标 解决方案 api不知道,但操作注册表进行实现肯定是可以的. 解决方案二: 注册表也可以,那么是哪个hkey 解决方案三: 还在不,注册表如何实现那 解决方案四: 好像 HKEY_CLASSES_ROOTLocal SettingsSoftwareMicrosoftWindowsCurrentVersionTrayNotify 解决方案五: 没有API. 提供API的话微软就不用做隐藏通知区域图标这个功能了,程序员都会用API绕过这个限