一个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

首先'.'符号是php的字符串连接符,2个点的作用是连接成一句话。
第一句话的单引号是为了,给这个值加上单引号。到时候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语句加入引号的问题的主要内容,如果未能解决你的问题,请参考以下文章

项目开发中使用存储过程和直接使用SQL语句的区别

sql语句字符串的嵌套问题

用存储过程好,还是在代码中写SQL语句好

存储过程变量中存储SQL语句被截断的问题

怎样SQL存储过程中执行动态SQL语句

怎么查看一个存储过程的SQL语句