sql动态查询返回值的意义是啥呢?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql动态查询返回值的意义是啥呢?相关的知识,希望对你有一定的参考价值。

如图这样的语句在程序中可以获得到它的结果集,但是如果把@sql中@name=
以及@name相关项都去掉的话,还是有返回表的,而且和上面的返回是相同的。
那么返回值的意义是什么呢?
还有就是如何返回结果集呢?

@name只是返回一个标量值,它的有无并不影响sp那个扩展存储过程的执行
如果你这个执行后,无论是否得到一个表集,都会将@name这个标量值输出
当然需要在程序中额外的方法接收
当然如果你不想用这种方式,你就想用表集的形式接收也可以
sql语句拼接时,直接select name from即可,最后一句select @out_name去掉就可以了
没有@name变量,相应的接收变量@out_name都去掉就好

这个sp_executesql存储过程的输出参数主要是为了解决拼接sql语句时,不能将拼接为字符的变量定义或输出到外面的问题,举个简单的例子

比如你要查询一个表的数量,那么where条件是动态的,这时就必须使用动态拼接sql语句
而查询得到的这个数量你需要赋值到一个变量中,用来进一步的计算或使用
这时,你用exec 执行的结果如何赋值到变量中呢?答案就是图中所示的方法追问

那如何返回结果集呢?

追答

就你这个句子而言,完全没必要用到拼接执行
就运行一句select name from tb where id=@id
然后给@id赋值就好了,就是结果集了啊

你途中最后一句select @out_name,在程序里面得到的也是结果集啊
你具体想得到什么结果呢?

追问

这个没有出于什么考虑,我就是看看怎么用?这个不是把@out_name返回了吗?我想返回一个结果集。

追答

只要内部拼接的sql语句中,含有输出语句即可返回结果集
如select * from tb这样的语句,也就是如图中,
你只需要把select @name=name改成select name from 。。。
这样就可以返回结果集了

追问

我想要用参数把结果集带出来,就像@name带出name值一样。

你看看这段代码:

就是着实没看懂。它并没有把结果集带出来啊。难道填到临时表里就算完事了吗?算了分给你吧。

追答

你这个截图并没有输出啊,只是用exec将执行的结果插入了临时表而已
当然这个临时表中存储的就是你要的结构及数据
简单点说,就是不需要将结果集赋值变量的,就直接select输出
需要将表集存入变量的,就事先定义表变量或临时表,然后将结果存入其中

参考技术A 提高查询效率,只查需要的字段,而不是表所有字段 参考技术B 楼主对sql语法不熟悉吧,
@name是一个变量,
select @name=name from ... 这句话的意思是查询出表中的name字段,然后赋值给@name,
这样就能够在下面的语句中用@name了
参考技术C 提高查询效率,保证尽量少的字段名称到前台,安全无污染,放心产品!追问

你居然和楼下回答的一样,难道说是有道理的?
我之前是这么写select@name=name最后返回@name。但如果我只写select name最后在程序中也可以获取到查询结果啊。而且@name要select一次才能获取到。不select的话就获取不到。
我并没有查其他字段,查询的都是同一字段啊。

追答

select XX 能在sql查询浏览器下面显示出来
print Xx 也能

从sql中返回的查询值的子查询?

我有三张桌子 - 销售,销售详情,药品。从销售表中,我将收集sale_id,然后我将从sales_details获取特定销售的详细信息。除此之外,在sales_details中,还有一个用于医学ID(mid)的单元格。使用那个中期,我还想获得药物名称并在一个查询中返回所有数据。

这是我到目前为止的情况 -

        SELECT `mid`, `qty`, `rate`, `total_price`, `discount`, `total_discount`, (SELECT `medicine`.`product_name` FROM `medicine` WHERE `sales_details`.`mid` = `medicine`.`product_id`) AS 'medicine_name'
        FROM `sales_details`
        WHERE `sale_id` IN (SELECT `sale_id` FROM `sales` WHERE `invoice_no` = '$invoiceID;

我得到所有数据,包括mid,但每行中的medicine_name为空。查询plz有什么问题?

答案

您可以使用内部联接来避免子查询

  SELECT s.`mid`
  , s.`qty`
  , s.`rate`
  , s.`total_price`
  , s.`discount`
  , s.`total_discount`
  , m.`product_name` medicine_name
  FROM `sales_details` d
  INNER JOIN `medicine` d.mid = m.product_id 
  INNER JOIN sales  s on s.sale_id = d.sale_id AND $invoiceID

但是不应该在sql中使用php var你有sqlinjection的风险..为此请看看你的sql驱动程序的绑定参数

以上是关于sql动态查询返回值的意义是啥呢?的主要内容,如果未能解决你的问题,请参考以下文章

sql子查询和连接查询的区别是啥呢?

如何在 LINQ SQL C# 中返回动态周数?

SQL Server:从查询返回的动态列

SQL动态列查询

动态 SQL 在 Access 直通查询中未返回结果

这种动态 SQL 查询生成对注入安全吗?