SQL 动态SQL语句查询获取数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL 动态SQL语句查询获取数据相关的知识,希望对你有一定的参考价值。

例如我动态获取到SQL语句
@SQL='DECLARE @N1 INT
DECLARE @N2 INT
SELECT @N1=1
SELECT @N2=2
SELECT @N1 num1,@N2 num2'
然后我想要的是获取num1和num2这两个值,注不是查询打印出来,是获取,因为后面要用到。

不考虑修改获取SQL语句前的动作,即获取的SQL语句是怎样就怎样

参考技术A declare @SQL nvarchar(1024)
set @SQL='DECLARE @N1 INT  DECLARE @N2 INT  SELECT @N1=1 SELECT @N2=2  SELECT @N1  num1,@N2  num2'    ----获取@SQL
EXECUTE sp_sqlexec @SQL  --执行获取的SQL语句

追问

这样只是显示出来而已,我得到这两个然后进行其它的处理

我想要的是:
首先定义两个变量
DECLARE @NUM1 INT
DECLARE @NUM2 INT
然后将动态sql语句获取的num1和num2的值赋给@NUM1和@NUM2

追答获取不了两个值,只能获取一个值
declare @SQL nvarchar(1024) ,@num1 int
set @SQL='DECLARE @N1 INT  DECLARE @N2 INT  SELECT @N1=1 SELECT @N2=2  SELECT @num1=@N1 '    
EXEC sp_executesql @SQL ,N'@num1 int  output ',@num1  output
select @num1

本回答被提问者和网友采纳
参考技术B 看下这个写法对你有没有帮助,有其它问题可以继续问

DECLARE @Sql NVARCHAR(max)

DECLARE @N1 INT
DECLARE @N2 INT
SELECT @SQL='
SELECT @N1=1
SELECT @N2=2
SELECT @N1 num1,@N2 num2'
EXEC sys.sp_executesql @Sql,
N'@N1 INT out,@N2 INT out',
@N1 OUT,@N2 OUT
SELECT @N1,@N2
参考技术C SELECT @N1=num1,@N2 = num2追问

我给出的sql语句是由于字数限制而改的最最优化语,请不用过于考虑,SQL语句最后得出的结果是 SELECT num1,num2

至于你到底想表达什么真真不明白,如果你是想说用sp_executesql的话,那问题就是怎么改sql语句了,可是sql语句在获取前是绝对不能改的,要改也只能是获取后的@SQL,可问题就来了,怎么改?

追答

现在不明白你是想要什么了 想要结果的话执行完语句不就有结果了吗

追问

我想要的是:
首先定义两个变量
DECLARE @NUM1 INT
DECLARE @NUM2 INT
然后将动态sql语句获取的num1和num2的值赋给@NUM1和@NUM2
不要问为什么要这样,因为获取这两个值是我要实现真正目的的前提条件。

追答

这样的话 我觉得应该在存储过程中处理

追问

.........我就是在写存储过程啊,这是我要写的存储过程的一部分,获取的数据就要用来进行运算的。

追答

不是太理解了 在存储过程中定义了变量 把查询语句的结果set给变量不就可以了吗

追问

我的目的是:先从表A读出SQL语句(注:这些语句最后都是SELECT num1,num2这种形式),获取sql语句中的值,然后经过一系列的处理,插入或更新到表B中

追答

先执行动态语句 返回一个临时表 然后查询临时表把值赋给变量

SQL Select 语句排除数据

【中文标题】SQL Select 语句排除数据【英文标题】:SQL Select statement to exclude data 【发布时间】:2014-03-26 17:18:33 【问题描述】:

我正在尝试编写 SQL 查询以在 Configuration Manager 2012 中设置动态集合。我当前的查询是

select * from SMS_R_System where SMS_R_System.Name LIKE 'cmgr%'

这将获取以cmgr 开头的任何服务器名称并将其放入指定的集合中。

我的问题是我需要在此查询中添加另一个语句以排除包含以下条目 qwdwtw 的服务器。这将防止我的非生产服务器被放入生产集合中。

我对 SQL 脚本的了解非常有限,因此感谢任何反馈。

【问题讨论】:

哪个字段包含条目'qw'、'dw'、'tw'? Adam,服务器名称为 serverappPW1 或 serverappQW1。它们是整个服务器名称的一部分,这是我们区分生产和非生产的方式... 什么是 Configuration Manager 2012? 配置管理器 2012 是 Microsoft System Center Suite 产品(以前称为 SMS)的一部分。用于软件分发、补丁管理和系统远程管理。 【参考方案1】:

你能用这样的东西吗?

select * from SMS_R_System 
where SMS_R_System.Name LIKE 'cmgr%'
AND SMS_R_System.Name NOT LIKE '%qw%' 
AND SMS_R_System.Name NOT LIKE '%dw%' 
AND SMS_R_System.Name  NOT LIKE '%tw%'

【讨论】:

Roryap,谢谢。这可能会奏效。将服务器放入 Config Mgr 后,我需要进行测试。我会让你知道...再次感谢 您好,感谢您对此的所有建议。查询一直在工作,但我没有更复杂的查询。我有一个包含多个服务器名称的集合。我可以通过添加 OR 语句来更新我现有的查询。它看起来像这样: select * from SMS_R_System where SMS_R_System.Name LIKE 'acl%' OR SMS_R_System.Name LIKE 'bre%' OR SMS_R_System.Name LIKE 'eps%' OR SMS_R_System.Name LIKE 'hrk%' AND SMS_R_System .Name NOT LIKE '%qw%' AND SMS_R_System.Name NOT LIKE '%dw%' AND SMS_R_System.Name NOT LIKE '%tw%' 现在的问题是 AND 语句未被识别为具有 qw、dw 和tw 正在从查询中返回。关于如何使这一切正常工作的任何想法?顺便说一句,Config Mgr 是 Microsoft System Center Configuration Manager....谢谢【参考方案2】:

您可能想看看that previous answer,它谈到了在查询中使用NOT EXISTS 命令。

【讨论】:

以上是关于SQL 动态SQL语句查询获取数据的主要内容,如果未能解决你的问题,请参考以下文章

如何获取Oracle数据库中sql语句的执行时间

SQL Select 语句排除数据

sql语句 分次(多次)获取不重复记录,请高手赐教!

将Sql查询语句获取的数据插入到List列表里面

如何使用 pl sql 过程从结构仅在运行时知道的 oracle 表中动态获取数据?

sqlmap获取1-100数据的语句怎么敲?