获得拼凑SQL语句运行后的结果

本文探讨了在SQL中如何处理动态查询的问题,特别是在存储过程中使用拼接方式来实现复杂查询的方法。通过创建临时表并利用EXEC进行数据填充,解决在SQL函数内部使用带有参数的远程函数调用难题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

拼凑式的SQL语句太普遍了,比如说,任意条件的查询。

这种拼凑SQL语句,如果在数据库端组装,必然是一条长长的字符串,然后 exec(@sql)。

如果这条语句写在存储过程里边,存储过程的调用方会获得查询结果。但假如是这个存储过程里面就想拿到结果来进行处理,怎么办呢?

select exec(@sql)必然是错的。

可以酱紫:

declare @t TABLE
(
	[CatchResultID] [bigint] NOT NULL,
	[WebSiteKeyWordID] [int] NULL,
	[Url] [varchar](300) NULL,
	[Title] [varchar](300) NULL,
	[CatchDate] [smalldatetime] NULL
);
		
DECLARE @ID	INT = 525215449;
--使用了链接服务器,调用其数据库里的自定义函数
declare @sql varchar(1000) = 'SELECT * FROM OPENQUERY([192.168.15.2,8888]
,''SELECT * FROM [db].dbo.cr_func_GetCatchResultById(' + CAST(@ID AS varchar(50)) + ')'');';
INSERT INTO @t(
   [CatchResultID]
  ,[WebSiteKeyWordID]
  ,[Url]
  ,[Title]
  ,[CatchDate]
)
exec(@sql);
--看,里面有结果矣
select * from @t;

为什么使用链接服务器的函数要用拼凑SQL呢,主要是因为有参数。而使用链接服务器的函数,不可以这样的:

SELECT * FROM OPENQUERY([192.168.15.2,8888],@sql);

===========================================================

很遗憾,这种方式不能用在SQL的函数里,否则报错:

在函数内对带副作用的运算符 'INSERT EXEC' 的使用无效

### 恢复或重新生成丢失的 SQL 创建表格语句 #### 使用 `SHOW CREATE TABLE` 命令 如果仍然有访问数据库权限并且表结构还在,则可以通过 MySQL 的内置命令来获取建表语句。对于每一个存在的表,可以使用下面这条指令: ```sql SHOW CREATE TABLE table_name; ``` 这会返回两个字段的结果集:一个是表的名字;另一个就是完整的CREATE TABLE语句[^2]。 #### 利用备份文件恢复 如果有定期做逻辑备份的习惯(比如mysqldump),那么可以从最近一次成功的全量备份里面找到对应的DDL脚本。通常情况下,这些备份会被保存成.sql格式的文字文件,在其中搜索目标表名即可定位到所需的创建语法[^4]。 #### PowerDesigner 物理模型导出 假如最初设计阶段是借助PowerDesigner这类CASE工具完成的话,应该可以在项目文档里发现相应的ER图或者PDM文件。打开它们之后,选择要重建的那个关系型实体对象,再利用软件自带的功能将其转换为特定版本MySQL所支持的标准SQL DDL描述。 #### 自动化工具辅助 一些第三方应用程序可以帮助自动化这个过程。例如dbForge Studio for MySQL 或者 Navicat Premium都提供了图形界面让用户方便地浏览现有架构并一键提取出各个表的定义信息[^3]。 #### 手工编写 当以上途径都不适用时,只能依据记忆以及业务需求尽可能详尽准确地重构原始的设计思路,逐条拼凑出近似的声明式编程表达方式。当然这样做风险较大,容易遗漏某些细节特性配置项,因此建议尽量避免采用这种方法除非万不得已[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值