一个sql存储过程中@sql语句加入引号的问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一个sql存储过程中@sql语句加入引号的问题相关的知识,希望对你有一定的参考价值。
请教各位大侠:
proc 中使用@sql加入TSQL语句如何加入引号啊?加了引号生成存储过程时报错,不加执行存储过程报错,无语...
举例:
create proc test
as
declare @sql varchar(500)
set @sql='select * from a where 姓名='张三''---------这个报错
----set @sql='select * from a where 姓名='+'''+'张三'+'''--------这个也报错,搞死了,请问怎么改?
set @sql='select * from a where 姓名=张三'---------不加执行的时候报错, EXEC test
第一句话的单引号是为了,给这个值加上单引号。到时候sql语句,就是这样了。select
user_id
from
user
where
`user_id`='11111'
其实这样写很是看起来不明了,这样写的话,就好看多了
$uid=$_post['user_id'];
$sql="select
user_id
from
user
where
`user_id`='$uid'"; 参考技术A 转义一下就好了在sql中中的转义为单引号('),针对你的那个语句来说变成这样就可以了,如下:
set @sql='select * from a where 姓名='‘张三’''
我没有试过,你试下好了
补充:你也可以在你的开始定义个常量
declare @xm varchar(10)
set @sql='select * from a where 姓名=@xm'本回答被提问者采纳 参考技术B set @sql='select * from a where 姓名=''张三'''
除了开头和结尾的两个'不变 其他的一个'换成2个'
在 SnowFlake DB 中并行执行存储过程中的 SQL 语句
【中文标题】在 SnowFlake DB 中并行执行存储过程中的 SQL 语句【英文标题】:Execution of SQL Statements inside Stored Procedure in Parallel in SnowFlake DB 【发布时间】:2020-10-07 06:28:10 【问题描述】:在 SnowFlake 中,是否有任何选项可以在存储过程中并行执行 sql 语句。我有一个存储过程(如下所示),它有 35 个 sql 语句,它们按顺序运行。我们计划减少时间,考虑并行执行所有这些。
实现这一目标的最佳方法是什么? (我所能想到的就是创建 35 个存储过程并同时从调度程序中调用它们)。想检查是否有任何 SnowFlake 功能的更好方法来实现这一点?
create or replace procedure SP_TEST()
returns string
language javascript
execute as CALLER
as
$$
try
var step_num = 0
step_num = 0
step_num++ //--#1
var sql_statement1 = snowflake.createStatement( sqlText: `INSERT INTO TGT_TBL select * from TBL_A` )
var sql_statement1_execute = sql_statement1.execute()
step_num++ //--#1
var sql_statement2 = snowflake.createStatement( sqlText: `INSERT INTO TGT_TBL select * from TBL_B` )
var sql_statement2_execute = sql_statement2.execute()
return "Completed "+step_num+" steps to load into TGT_TBL"
catch (err)
throw(err)
$$
;
【问题讨论】:
【参考方案1】:实际上它是连续的,因为您正在为每条语句运行 execute() 方法。
直接回答您的问题:在单个过程中实现并行化是不可能的,据我所知没有功能或特定方法。
但总的来说:增加仓库大小是节省一些时间的好方法,因为查询可能会运行得更快。它不是并行的,但速度更快。
在我看来,当您使用单个程序时,横向扩展(即使用多集群仓库)不会带来好处。
【讨论】:
【参考方案2】:作为创建 35 个任务的替代方案,您可以考虑创建一个任务来调用存储过程,该存储过程将创建 35 个任务来调用这些单独的查询。如果查询 SQL 可以从表中读取,或者其中的一部分可以通过 JavaScript 生成(例如带有日期的表名,即 CONNECT20200120 等),那么它可能是一个很好的自动化。
【讨论】:
能否详细解释一下。我知道我可以将查询保留在表中并从那里获取。但是,我怎样才能让这 35 条语句不按顺序运行呢? 您需要为并行运行的每个查询创建一个新任务。我在这里只看到一个问题,雪花不支持一次性任务。因此可以有一个使用“after”子句定义的主任务和子任务,以及一个在第一次运行后删除所有任务的更清洁任务。【参考方案3】:将您的 SP 分成几个(应该并行运行)并使用 SF 相关任务在主要部分完成后运行差异部分。
【讨论】:
【参考方案4】:如果您的目标是使用多个表 [TBL_A、TBL_B、...、TBL_35] 中的值填充表 TGT_TBL。我建议您使用第三方工具,例如 dbt、Informatica Cloud (IICS) 或此列表中您喜欢的任何工具 https://docs.snowflake.com/en/user-guide/ecosystem-etl.html。
事实上,Snowflake 存储过程甚至任务是有限的,也难以监控完整的编排/集成管道。
将 IICS 与 Pushdown Optimization 或 dbt 结合使用,您可以使用增量加载方法并在 Snowflake 上同时执行所有 35 条 sql 语句,而仍然具有 Snowflake 虚拟仓库的强大功能。
【讨论】:
以上是关于一个sql存储过程中@sql语句加入引号的问题的主要内容,如果未能解决你的问题,请参考以下文章