标签: dynamic-sql

在 Oracle 存储过程中使用动态 sql

假设我有以下程序

CREATE PROCEDURE foo (table1_id IN TABLE1.table1_id%type, 
                     table1_val IN TABLE1.table1_value%type) 
AS 
  SQL_UPDATE VARCHAR2(500) := 'UPDATE TABLE1 SET table1_value =:1 WHERE table1_id = :2';
BEGIN
  --.....
  --1 : 
    EXECUTE IMMEDIATE SQL_UPDATE USING foo.table1_val, foo.table1_id;
  --2 : 
    UPDATE TABLE1 SET table1_value = foo.table1_val WHERE table1_id = foo.table1_id;

END;
Run Code Online (Sandbox Code Playgroud)

除了样式/可读性之外,在这种情况下(我的意思是绝对可以避免的情况)使用动态查询 (1) 与 (2) 相比是否有任何性能损失?

谢谢你。

oracle dynamic-sql

2
推荐指数
1
解决办法
4788
查看次数

在 PostgreSQL 中使用动态列名

我正在使用 PostgreSSQL 8.3。

我想执行这个查询:

select COALESCE(col_fr,col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

故事中的扭曲是列名colum_fr应该动态生成。my_table对于不同的语言有不同的列。就像是:

id   col   col_ja    col_fr
Run Code Online (Sandbox Code Playgroud)

我在水晶报告中使用此查询,我可以在其中传递语言的字符串参数:

select COALESCE(col_||{?parameter},col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

如果{?language}value 是,它将在内部转换为如下内容fr

select COALESCE(col_||'fr',col,'Unknown') from my_table where id = 'abc';
Run Code Online (Sandbox Code Playgroud)

这永远不会奏效。

我不想使用选择大小写,使其动态化。
作为替代解决方案,我还尝试创建一个存储过程:

CREATE OR REPLACE FUNCTION get_policy_name (
  id text,
  lang   text,
  def_value text
)
RETURNS SETOF record AS
$body$
DECLARE
   sql text;
BEGIN
    sql := 'SELECT   COALESCE(col_'||quote_ident(lang)||',col,'||quote_literal(def_value)||')FROM my_table WHERE id ='||quote_literal(id);

   RETURN QUERY EXECUTE …
Run Code Online (Sandbox Code Playgroud)

postgresql stored-procedures dynamic-sql plpgsql postgresql-8.3

2
推荐指数
1
解决办法
2万
查看次数

如何在函数中按顺序对表列表运行 ALTER TABLE

我有一个模式(称为import),其中数据作为表导入,以及一个处理它们的函数。之后我想将这些表移到另一个模式中(称为data_archive)中。现有功能运行良好,但我找不到更改架构的方法;这是我编写的一个函数:

我的想法是根据selecta 为该管理制作的表格提供的标准创建表格列表,然后遍历此列表并执行以下操作Alter table xxxx SET schema data_archive

CREATE OR REPLACE FUNCTION archive_datasets()
  RETURNS VOID AS
$BODY$
DECLARE
   table_rec  record;

BEGIN

   FOR table_rec IN
      SELECT t.table_name
      FROM information_schema.tables AS t
      WHERE table_schema = 'import'
      AND quote_ident(t.table_name) IN (
              SELECT "table_name"
              FROM data_sets 
              WHERE status IN ('Processed', 'Archived', 'Deleted')
              ) 

   LOOP
     ALTER TABLE quote_ident(table_rec.table_name) SET schema data_archived;
   END LOOP;

END;
$BODY$
  LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

但我收到此错误消息:

ERROR:  syntax error at or near "("
LINE 28: …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql alter-table plpgsql functions

2
推荐指数
1
解决办法
3248
查看次数

执行从选择生成的动态 SQL

SQL 中的一个业务流程可以为每个操作生成一个变量1-N 次调用存储过程,其目的是插入与主流程相关的数据。

如何从选择执行多行生成的 sql 或者有没有办法从选择调用存储过程?


这一步之前的过程是涉及到业务逻辑和数据驱动的操作,对相关的FK连接表做了后续的插入。

在需要调用存储过程的那一点上,它已经准备好在表变量中处理数据。调用存储过程的步骤(过程中的逻辑)是一个涉及过程,在存储过程中是有意义的,并且不能复制到现有过程中。


Select.

SELECT 'EXEC [sim].[ROI_Save] ' + CONVERT(varchar(6), VSL.PathId)           + ', '
                                + Convert(varchar(6), @ROIResultId)         + ', '
                                + CONVERT(varchar(6), RT.routeTypeResultId) + ', '
                                + CONVERT(varchar(6), RT.ROI_RouteTypeId)   + '; '
FROM  @routeResultIds RT
JOIN sim.ROI_Result_Vehicle VSL ON RT.ROI_Result_VehicleId = VSL.ROI_Result_VehicleId 
Run Code Online (Sandbox Code Playgroud)

结果

在此处输入图片说明

是否连接结果并调用Exec

sql-server dynamic-sql t-sql sql-server-2012

2
推荐指数
1
解决办法
3478
查看次数

如何使用表列中的值作为 SELECT 查询中的字段名称?

设想:

Table1 的字段名称命名为 testtable

ID、名称、大小、宽度、高度

Table2 的字段名称命名为 errortable

id,desc,field1,field2,operator

errortable 的值

+----+-------------------------------------+--------+--------+----------+
| id |                desc                 | field1 | field2 | operator |
+----+-------------------------------------+--------+--------+----------+
|  1 | size should not greater than width  | size   | width  | >        |
|  2 | size should not greater than height | size   | height | >        |
|  3 | with should be equal to height      | width  | height | <>       |
+----+-------------------------------------+--------+--------+----------+
Run Code Online (Sandbox Code Playgroud)

现在我想检查testtable

  1. 计算大小 > 宽度的所有记录。
  2. 计算大小 …

mysql postgresql dynamic-sql plpgsql

2
推荐指数
1
解决办法
8312
查看次数

如何将数据库列表传递给 sp_MSforeachdb?

我有以下脚本,运行时给我一个逗号分隔的数据库名称列表。

        SET NOCOUNT ON
        declare @db_list NVARCHAR(MAX)
        DECLARE @command varchar(1000)

        SELECT @COMMAND = 'SELECT DB_NAME()'

         SELECT @db_list  = STUFF((
                                    SELECT ', ' + name FROM sys.databases
                                    WHERE name like '__Order'
                                    FOR XML PATH(''), 
                                    TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '')

         -- in case there are no DBs to show, then show no DB '***'
         select @db_list = COALESCE(@db_list,'***') 

         SELECT @db_list = RTRIM(LTRIM(REPLACE(@DB_LIST,',', ',''')))  


         select @db_list 
Run Code Online (Sandbox Code Playgroud)

这给了我以下结果:

UKOrder,' ATOrder,' AUOrder
Run Code Online (Sandbox Code Playgroud)

1)这给出了错误的结果集,我希望它是

'UKOrder','ATOrder','AUOrder'
Run Code Online (Sandbox Code Playgroud)

2) 如何将@db_list 传递给 sp_MSforeachdb?

假设我想跑

选择 db_name()

在@db_list 中的每个数据库中

英国订单

订单 …

sql-server dynamic-sql sql-server-2008-r2 sql-server-2012 sql-server-2014

2
推荐指数
1
解决办法
1160
查看次数

本机动态 SQL - 使用列名和表名立即执行

我必须进行动态查询,它使用 oracle pl/sql 中的本机动态 sql 动态绑定列名和表名。

这是我的第一次尝试:

declare 
  komenda varchar2(255);
  v1 varchar2(10):='id_osrodek';
  v2 varchar2(10):='nazwa_o';
  v3 varchar2(10):='osrodki';
begin
  komenda := 'select distinct e.id_student, e.przedmiot, e.:1, o.:2 from egzaminy e
    inner join :3 o on o.:4 = e.:5
    inner join przedmioty p on e.id_przedmiot = p.id_przedmiot';
  execute immediate komenda using v1, v2, v3, v1, v1;
end;
Run Code Online (Sandbox Code Playgroud)

第二:

declare 
  komenda varchar2(255);
  v1 varchar2(10):='id_osrodek';
  v2 varchar2(10):='nazwa_o';
  v3 varchar2(10):='osrodki';
begin
  komenda := 'select distinct e.id_student, p.nazwa_p, e.' || v1 || ', o.' || v2 || …
Run Code Online (Sandbox Code Playgroud)

oracle dynamic-sql

2
推荐指数
1
解决办法
903
查看次数

具有分页、性能和优化的动态 SQL 查询

我面前有一个有趣的问题。有一个数据库有大约 100 万个用户帐户,预计每年增长 1-200 万个。该数据库是强 TPT,但此特定查询和所涉及的表不涉及任何 TPT 内容。

当指定第二个数据点(即电子邮件地址和姓氏、公司等)时,sproc 和视图的当前设计需要大约 15 秒来执行 (x2)。该数据库是 SQL Azure P11,但它不是 DTU 绑定查询,升级到最高可用产品 (P15) 对结果没有影响。

下面是 sproc、视图和执行计划。在过去 24 小时内重建或重组了所有索引,并更新了所有统计信息。例如,在查看数据时,历史电子邮件地址 (1..N) 的概念目前正在使用 aCROSS APPLY来获取最新的,这可以防止索引视图,可以通过简单地连接历史电子邮件地址和持久化来解决它们在一个列中。

许多数据库在 nvarchar(4000-max) 列中使用 JSON,所有这些列都有一个公开值并启用索引的计算列。范式必须支持分页,我正在寻找有关如何优化它的反馈/建议。

在这一点上,更改表结构不是一个可行的选择,尽管我可以通过一点点操作看到前进的道路。有没有人对我应该首先看哪里有任何想法?我已经对未知的重新编译和优化进行了测试,以查看是否有任何影响,如果有,则可以忽略不计。

注意:一些业务逻辑(专有列名被删除或修改,sproc和view不能按原样执行,但在功能上与源相同。

执行计划视图

程序

CREATE PROCEDURE [dbo].[spGetUserDetailsDynamic] @JsonFilter NVARCHAR(MAX)
AS /* Page number*/
DECLARE @Page AS INT = JSON_VALUE(@JsonFilter, '$.requestPaging.page');
/* Number of records on the page*/
DECLARE @Size AS INT = JSON_VALUE(@JsonFilter, '$.requestPaging.size');

IF (@Page = -1)
    SET @Page = 1;

IF (@Size …
Run Code Online (Sandbox Code Playgroud)

performance sql-server dynamic-sql azure-sql-database query-performance

2
推荐指数
1
解决办法
1284
查看次数

安全引用类型名称以防止 SQL 注入

我将如何引用类型名称以防止 SQL 注入。例如,拿这个

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int');
                                                 ^ Quote this
Run Code Online (Sandbox Code Playgroud)

这很好用,但如果'int'相反,''int); DROP DATABASE foo;SELECT ('你会遇到一些问题,

SELECT FORMAT('SELECT CAST(%L AS %s);', '5.42', 'int); DROP DATABASE foo;SELECT (');
                          format                          
----------------------------------------------------------
 SELECT CAST('5.42' AS int); DROP DATABASE foo;SELECT ();
(1 row)
Run Code Online (Sandbox Code Playgroud)

我将如何使用动态 SQL 安全地转换为运行时提供的类型?如果我使用%I而不是%s我得到一个标识符(用 安全引用",但类型名称不是标识符并且不能使用双引号)。

受到try_castJasen提供的“PostgreSQL 替代 SQL Server功能”的回答的启发

postgresql sql-injection datatypes dynamic-sql

2
推荐指数
1
解决办法
514
查看次数

使用 oneliner sql 语句创建包含换行符的存储过程

我想将代码放在一行中,该行将创建一个包含换行符的存储过程。

  • 那可能吗?
  • 我需要使用 sp_executesql 吗?
  • 如何在 sql 语句中转义换行符?
  • 如何在字符串中转义换行符?

sql-server stored-procedures dynamic-sql t-sql

2
推荐指数
1
解决办法
2461
查看次数