标签: dynamic-sql

如何在T-SQL中执行之前解析动态SQL?

我需要知道如何解析一个查询,以便在执行之前知道它是否构建良好.如果解析是正确的,那么执行它,如果不丢弃它.

我无法使用SET NOEXEC,SET PARSEONLY,TRY/CATCH完成此操作.

我在循环中使用动态sql.有时动态sql不正确,不是因为我的错,而是因为数据库中存在的信息.出于这个原因,我想在执行之前解析它.

t-sql parsing sql-server-2005 dynamic-sql

5
推荐指数
2
解决办法
5640
查看次数

使用带有绑定变量的Execute Immediate语句时,表名称错误无效

我正在尝试让这个动态SQL运行(使用EXECUTE IMMEDIATE)

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 from :m_var2 RETURNING MAX(:m_var1)+1 INTO :m_var3';

EXECUTE IMMEDIATE M_SQL_STATEMENT
   USING M_COLUMN_NAME, UPPER(P_TABLE_NAME), M_COLUMN_NAME
   RETURNING INTO M_SEQ_NUMBER;
Run Code Online (Sandbox Code Playgroud)

但是,在尝试运行时,我一直在努力

ORA-00903: Invalid table
Run Code Online (Sandbox Code Playgroud)

P_TABLE_NAME是一个表名,可以作为输入接受.我已确认表名和列名有效.我无法弄清楚为什么Oracle会抛出错误.

FWIW将SQL语句更改为

M_SQL_STATEMENT := 'SELECT MAX(:m_var1)+1 SEQ from :m_var2 RETURNING SEQ INTO :m_var3';
Run Code Online (Sandbox Code Playgroud)

仍会导致相同的错误.

plsql dynamic-sql oracle10g execute-immediate

5
推荐指数
1
解决办法
6103
查看次数

在PL/PgSQL EXECUTE动态查询中正确插入文字

以下是plpgsql函数的一部分.问题是,结果source_geomtarget_geomcharacter varying数据类型,因此我需要两个环绕source_geom,并target_geom在引号("").问题是在plpgsql语言中我怎么不知道我能做到.
这就是我现在所拥有的:

 EXECUTE 'update ' || quote_ident(geom_table) || 
        ' SET source = ' || source_geom || 
        ', target = ' || target_geom ||
        ' WHERE ' || quote_ident(gid_cname) || ' =  ' || _r.id;
Run Code Online (Sandbox Code Playgroud)

我遇到的错误如下:

ERROR:  syntax error at or near "C03B9E3B66052D400DDEFC2BD0F24140"
LINE 1: ...pdate track_points SET source = 0101000020E6100000C03B9E3B66...
                                                             ^
QUERY:  update track_points SET source = 0101000020E6100000C03B9E3B66052D400DDEFC2BD0F24140, target = 0101000020E610000075690DEF83052D40F88E75CCD4F24140 WHERE ogc_fid =  2
CONTEXT:  PL/pgSQL function "create_network" …
Run Code Online (Sandbox Code Playgroud)

sql postgresql dynamic-sql plpgsql

5
推荐指数
2
解决办法
7651
查看次数

以编程方式构建SQL查询的强大方法

我不得不求助于ORM不足的原始SQL(使用Django 1.7).问题是大多数查询最终都有80-90%的相似性.在不违反可重用性的情况下,我无法找到构建查询的强大而安全的方法.

字符串连接是唯一的出路,即使用if-else条件构建无参数查询字符串,然后使用预准备语句安全地包含参数(以避免SQL注入).我想按照一种简单的方法来为我的项目模板化SQL,而不是重新发明一个迷你ORM.

例如,考虑以下查询:

SELECT id, name, team, rank_score
FROM
  ( SELECT id, name, team
    ROW_NUMBER() OVER (PARTITION BY team
                       ORDER BY count_score DESC) AS rank_score
    FROM 
      (SELECT id, name, team
       COUNT(score) AS count_score
       FROM people
       INNER JOIN scores on (scores.people_id = people.id)
       GROUP BY id, name, team
      ) AS count_table
  ) AS rank_table
WHERE rank_score < 3
Run Code Online (Sandbox Code Playgroud)

我怎么能够:

a)添加可选WHERE约束people
b)更改INNER JOINLEFT OUTER
c)更改COUNTSUM
d)完全跳过该OVER …

sql postgresql orm dynamic-sql plpgsql

5
推荐指数
1
解决办法
1162
查看次数

截断PostgreSQL中模式中的所有表

我试图使用PostgreSQL截断模式中的所有表.它显示此错误:

ERROR:  relation "Building" does not exist
CONTEXT:  SQL statement "TRUNCATE TABLE "Building" CASCADE"
PL/pgSQL function truncate_schema(character varying) line 15 at EXECUTE statement
Run Code Online (Sandbox Code Playgroud)

这是我使用的功能:

CREATE OR REPLACE FUNCTION truncate_schema(schema IN VARCHAR) RETURNS void AS $$
DECLARE
    statements CURSOR FOR
        SELECT table_name FROM information_schema.tables
WHERE table_type = 'BASE TABLE' AND table_schema = schema;
BEGIN
    FOR stmt IN statements LOOP
        EXECUTE 'TRUNCATE TABLE ' || quote_ident(stmt.table_name) || ' CASCADE';
    END LOOP;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

怎么做得好?

postgresql function dynamic-sql plpgsql

5
推荐指数
1
解决办法
9766
查看次数

如何使用参数从函数创建VIEW?

我在PostgreSQL中有这个功能:

CREATE OR REPLACE FUNCTION func1(a integer, b timestamp, c integer[])
  RETURNS SETOF typ_new AS 
$BODY$
declare
begin
    CREATE OR REPLACE VIEW newView as (select * from func2($1,$2,$3));
end;
$BODY$
  LANGUAGE plpgsql VOLATILE
Run Code Online (Sandbox Code Playgroud)

func2也会返回,SETOF typ_new因此它们兼容.

运行时我收到一个错误:ERROR: there is no parameter $1 如果我更改$1为参数名称,a则错误更改为 ERROR: column "a" does not exist

我也尝试过动态SQL:

    sqlstr ='CREATE OR REPLACE VIEW newView (columns... ) as
              (select * from func2('||$1||','||$2||','||$3||'))';
    execute sqlstr;
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为$3integer[]||不能使用数组.

我该如何解决这个问题?

sql postgresql dynamic-sql

5
推荐指数
1
解决办法
5277
查看次数

Mybatis If语句使用包含属性

我试图在Mybatis中创建一个通用SQL包含,它将应用给定特定值的比较器。想法是在多个映射器之间重用此sql代码段。我遇到的问题是在include内的if语句中使用字符串替换时。

当前,xml如下所示:

<select id="get" parameterType="ServiceModelQueryHelper" resultMap="ServiceRecordMap">
    SELECT * from service
    <if test="name.isApplicable()">
        WHERE service.name
        <include refid=comparatorMapper>
            <property name="comparator" value="${name.comparator}"/>
            <property name="value" value="${name.value}"/>
        </include>
    </if>
</select>
<sql id="comparatorMapper">
    <if test="${comparator} == 'EQUALS'">
        = ${value}
    </if>
    <if test="${comparator} == 'CONTAINS'">
        ~ ${value}
    </if>
</sql>
Run Code Online (Sandbox Code Playgroud)

在测试内部使用$ {comparator}时,会在字符串替换发生之前评估OGNL表达式,从而导致ParseException,因为$不是有效的第一个字符。

有没有办法在OGNL表达式内引用sql片段的属性?

java postgresql dynamic-sql ognl mybatis

5
推荐指数
1
解决办法
4822
查看次数

动态sql嵌入在select查询中

我有一张桌子Users,

?????????????????????
? Id ? Name  ?  Db  ?
?????????????????????
?  1 ? Peter ? DB1  ?
?  2 ? John  ? DB16 ?
?  3 ? Alex  ? DB23 ?
?????????????????????

和许多具有相同结构的数据库(相同的表,相同的程序,......),所以每个数据库都有一个名为table的表Project,这就是Project表的结构,

??????????????????????????????
? Id ? Request ? Information ?
??????????????????????????????
?  1 ?     126 ? XB1         ?
?  2 ?     126 ? D6          ?
?  3 ?     202 ? BM-23       ?
??????????????????????????????

所以,当我查询数据库时:

SELECT count(distinct([Request])) as nbrRequests
  FROM [SRV02].[DB1].[dbo].[Project]
Run Code Online (Sandbox Code Playgroud)

我得到这个结果:

???????????????
? …

t-sql sql-server dynamic-sql

5
推荐指数
1
解决办法
129
查看次数

如何通过Entity Framework 7(Core)中的某些实体属性动态排序

我有一个项目,其中前端JavaScript指定要排序的列的列表.

然后在后端我有多层应用程序.典型情况

  1. 服务层(服务模型'(DTO)属性匹配客户端想要订购的任何内容)
  2. 域层(它公开存储库接口以访问持久化对象)
  3. ORM层(它实现了存储库,它使用Entity Framework 7(又名实体框架核心)来访问SQL Server数据库)

请注意,System.Linq.DynamicDNX Core v5.0或.NET Platform v5.4不支持,因此我无法使用该库.

我在我的Things存储库中有以下实现:

    public async Task<IEnumerable<Thing>> GetThingsAsync(IEnumerable<SortModel> sortModels)
    {
        var query = GetThingsQueryable(sortModels);
        var things = await query.ToListAsync();
        return things;
    }

    private IQueryable<Thing> GetThingsQueryable(IEnumerable<SortModel> sortModels)
    {

        var thingsQuery = _context.Things
                .Include(t => t.Other)
                .Where(t => t.Deleted == false);

        // this is the problematic area as it does not return a valid queryable
        string orderBySqlStatement = GetOrderBySqlStatement(sortModels);
        thingsQuery = thingsQuery.FromSql(orderBySqlStatement);
        return thingsQuery ;
    }

    /// this …
Run Code Online (Sandbox Code Playgroud)

linq dynamic-sql sql-order-by entity-framework-core asp.net-core

5
推荐指数
1
解决办法
6258
查看次数

PL / pgSQL函数中的动态SELECT INTO

如何SELECT INTO在Postgres的PL / pgSQL函数内编写动态查询?

假设我有一个名为的变量tb_name,它填充在的FOR循环中information_schema.tables。现在,我有一个名为的变量tc,它将获取每个表的行数。我想要以下内容:

FOR tb_name in select table_name from information_schema.tables where table_schema='some_schema' and table_name like '%1%'
LOOP
EXECUTE FORMAT('select count(*) into' || tc 'from' || tb_name);
END LOOP
Run Code Online (Sandbox Code Playgroud)

应该是什么数据类型tb_name,并tc在这种情况下?

postgresql dynamic-sql plpgsql variable-assignment stored-functions

5
推荐指数
1
解决办法
5155
查看次数