使用存储过程查询数据库(sql有动态拼接)

ps:针对上一篇内容,这次给出其中问题的答案,并使用存储过程输出正确的查询结果。
一、基本知识
1. 在书写存储过程时,由外部输入的变量值在定义时不使用declare,且定义位于创建过程和AS之间,包括要从数据库取出的值也需要在此定义;
2. 在存储过程中使用的变量值,需要使用declare定义,且位于AS之后,一般的sql变量也在这里定义,在1中定义了的变量需要对应的在此处定义其副本,以传值给拼接的sql语句。

二、上一篇问题说明
上一篇出现的问题就是在传值时,使得程序中的值未传入过程中的sql语句中,因为过程中定义的是函数内部的变量,相当于局部变量,并非形参,外部传值肯定不成功。

三、代码展示

  1. 存储过程函数
ALTER PROC sele_ratio
 @id VARCHAR(50),
 @time DATETIME,
 @checkTime DATETIME,
 @result1 INT OUTPUT,
 @result2 INT OUTPUT

AS
DECLARE @id_c VARCHAR(50)
DECLARE @time_c DATETIME
DECLARE @checkTime_c DATETIME
DECLARE @sql1 nvarchar(MAX)
DECLARE @sql2 nvarchar(MAX)
DECLARE @result1_c INT
DECLARE @result2_c INT

BEGIN
SET @time_c=@time;
SET @checkTime_c = @checkTime;
SET @id_c = @id;
SET @sql1='SELECT @a1= SUM(SmallBusFlow+SmallTruckFlow+LarBusFlow+MedTruckFlow+LarTruckFlow+SupLarTruckFlow+ContainerFlow+TractorFlow+MotorFlow)'
+' FROM tis_vehdetail_'+CAST(@id_c AS VARCHAR(50))+' WHERE RecNo = '
+'(SELECT RecNo FROM tis_vehbasic_'+@id_c+' WHERE CheckDate = '+''''+CONVERT(VARCHAR,@time_c,120)+''''+')'

SET @sql2='SELECT @a2= SUM(SmallBusFlow+SmallTruckFlow+LarBusFlow+MedTruckFlow+LarTruckFlow+SupLarTruckFlow+ContainerFlow+TractorFlow+MotorFlow)'
+' FROM tis_vehdetail_'+CAST(@id_c AS VARCHAR(50))+' WHERE RecNo = '
+'(SELECT RecNo FROM tis_vehbasic_'+@id_c+' WHERE CheckDate = '+''''+CONVERT(VARCHAR,@checkTime_c,120)+''''+')'
--EXEC(@sql)

EXEC sp_executesql @sql1, N'@a1 int output',@result1_c OUTPUT
EXEC sp_executesql @sql2, N'@a2 int output',@result2_c output
SET @result1=@result1_c
SET @result2=@result2_c
END
  1. 调用函数
''''''
string sql="sele_ratio";
SqlOper.GetByProcedure(sql,id,time,timeYes);
''''''
public int[] GetByProcedure(string sql,string id,DateTime time,DateTime timeYes)
{
int[] re=new int[2];
try
{
ConnectDB();
SqlCommand com=new SqlCommand(sql,cn);
com.CommandType=CommandType.StoredProcedure;
com.Parameters.Add(new SqlParameter("id",SqlDbType.VarChar,20)).Value=id;
com.Parameters.Add(new SqlParameter("@time",SqlDbType.DateTime,20)).Value=time;
com.Parameters.Add(new SqlParameter("@checkTime",SqlDbType.DateTime,20)).Value=timeYes;
com.Parameters.Add(new SqlParameters("@result1",SqlDbType.Int)).Direction=ParameterDirection.OutPut;
com.Parameters.Add(new SqlParameters("@result2",SqlDbType.Int)).Direction=ParameterDriction.OutPut;
com.ExecuteNoQuery();
if(com.Parameters["@result1"].Value.ToString().Equals("")||com.Parameters["@result1"].Value==null)
{
res[0]=0;
}
else
res[0]=com.Parameters[@result1].Value;
if(com.Parameters["@result2"].Value.ToString().Equals("")||com.Parameters["@result2"].Value==null)
{
res[1]=0;
}
else
res[1]=com.Parameters[@result2].Value;
}
catch(Exception ex)
{
MessageBox.Show(ex.ToString());
}
finally
{
DisposeDB();
}
return re;
}

四、感想
遇到问题不要浮躁,多联想,多途径找方法,慢慢排除,问题自然得以解决!

发布了15 篇原创文章 · 获赞 3 · 访问量 1万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览