标签: dynamic-sql

将 hstore 键动态转换为一组未知键的列

我有一个数据库,它使用hstore. 为了将其合并到另一个不支持 的数据库中hstore,我想将键拆分为额外的列。

用户可以添加新的自定义字段,因此我不能提前依赖键的知识。这在“来自 hstore 列的属性作为视图中的单独列”给出了答案不适用于我的问题。

如果一条记录在其他记录中没有键,则它应该获得具有空值的同一列。

我该怎么做呢?

postgresql pivot dynamic-sql hstore

8
推荐指数
2
解决办法
5876
查看次数

为什么这个游标以错误的顺序产生结果?

我正在编写一些动态 SQL 来识别,也许如果我觉得够疯狂,可以自动将我的NONCLUSTERED索引转换为CLUSTERED索引。

ORDER BY 1,2,3 DESC;下面的 SQL 中的这一行旨在在DROP INDEX...语句之前输出语句ALTER TABLE...,以便先删除 NONCLUSTERED 索引,然后添加一个 CLUSTERED 索引。我必须在第DESC3 列之后添加DROP,然后是 ALTER。这是倒退,除非我失去它!

DECLARE @Server nvarchar(max);
DECLARE @Database nvarchar(max);
DECLARE @cmd nvarchar(max);
DECLARE @IndexType int;


SET @IndexType = 2; /*  1 is CLUSTERED, 2 is NONCLUSTERED */
SET @Server = 'MyServer';
SET @Database = 'MyDatabase';

SET @cmd = '
    DECLARE @cmd nvarchar(max);
    SET @cmd = ''
    SET NOCOUNT ON;
    DECLARE @IndexInfo TABLE (TableName nvarchar(255), IndexName …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server dynamic-sql

7
推荐指数
2
解决办法
1301
查看次数

PostgreSQL 存储过程返回行或空集

我有一个存储过程,RETURNS SETOF ct_custom_type我在里面做

RETURN QUERY EXECUTE 'some dynamic query'
Run Code Online (Sandbox Code Playgroud)

我想这样做:如果这个“动态查询”返回 >= 10 行,我想返回它们,但如果它只返回 < 10 行,我不想返回任何东西(空集ct_custom_type)。

我试过:

RETURN QUERY EXECUTE 'some dynamic query'

GET DIAGNOSTICS variable = ROW_COUNT;
IF variable < 10 THEN

    # I don't know what to do here or how to accomplish this

END IF;
Run Code Online (Sandbox Code Playgroud)

如果我RETURN QUERY SELECT 0, 0, ''::text;IF块中执行(因为ct_custom_type是 的复合类型(integer, integer, text),它只是将这个“空行”添加到先前的查询结果中,但在这种情况下我不想返回任何内容,我可以这样做RETURN;,但它会返回先前的结果,我想丢弃它。

我有这样的:

EXECUTE 'dynamic query';

GET DIAGNOSTICS variable = ROW_COUNT; …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql functions

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

还有其他方法可以选择列的动态列表吗?

我需要让我的用户指定他们想要选择的列列表。到目前为止,我知道实现这一目标的两种方法。

1. 使用refcursors

CREATE OR REPLACE FUNCTION selecttestwithcolumnlist(
ticker character varying, 
columnlist character varying)
  RETURNS refcursor AS
$BODY$
DECLARE 
  ref1 refcursor;
BEGIN

OPEN ref1 FOR EXECUTE 
'select ' || ColumnList || ' from Prices WHERE Ticker=$1;'
USING     Ticker;
RETURN ref1;

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

这个函数很容易从我的 Ado.Net 客户端调用。我需要做的就是传递参数。但是,如果我想从 pgAdmin 测试此功能,则仅当我保持事务打开时,结果集才会在屏幕上打开。这很不方便。当然,将数据显示为 HTML 表格或 Excel 电子表格很容易,但这有点不方便。

2. 使用记录集

CREATE OR REPLACE FUNCTION SelectPrices(colList VARCHAR)
 RETURNS SETOF record AS
$func$
BEGIN

RETURN QUERY EXECUTE
'SELECT ' || colList || ' FROM prices ORDER …
Run Code Online (Sandbox Code Playgroud)

postgresql ado.net dynamic-sql postgresql-9.3 pgadmin-1.18

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

将函数参数添加到 SQL 查询 WHERE 子句

我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:

CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS 
$$
    SELECT .... FROM ...
    JOIN ...
    where true
    ;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)

我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是

AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)

Where 子句看起来像

where true AND speed = 0 AND ... 
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑

也可以接受许多参数(a int、b string、c string ..)但是我需要有

WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)

这是不可接受的。我怎样才能做到这一点?

或者我可以在里面放一个 if 语句吗?喜欢

Select .. . from ...
JOIN ... 
WHERE true
IF (a …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql java functions

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

从 %current% 表中选择的 PostgreSQL 触发器函数

我有多个具有相同列名的表,它们仅在列值上有所不同,例如:

tbl_log_a
tbl_log_b
tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

从 a 到 z 的 26 个表。每个表都有一个触发器,它调用一个触发器函数,它执行完全相同的操作:

SELECT columnname FROM tbl_log_a
Run Code Online (Sandbox Code Playgroud)

除此之外,我所有的触发器功能都做同样的事情。它们的不同之处在于:

select columnname FROM tbl_log_a
select columnname FROM tbl_log_b
select columnname FROM tbl_log_c
...
Run Code Online (Sandbox Code Playgroud)

所以我必须创建 26 个触发函数,每个tbl_log_%letter%. 有没有办法告诉触发器函数:

SELECT columnname FROM %currenttable%
Run Code Online (Sandbox Code Playgroud)

通过%currenttable%我的意思是当触发放在桌子上。或者:

SELECT columnname FROM tbl_log_%letter%
Run Code Online (Sandbox Code Playgroud)

Postgres 9.1 中可能吗?我正在阅读动态确定的表。有什么线索吗?我想将表名本身存储在一个变量中,而不是该表中的列,因为触发器函数适用于该表中的多个列。

TG_TABLE_NAME
TG_TABLE_SCHEMA
Run Code Online (Sandbox Code Playgroud)

postgresql trigger dynamic-sql plpgsql functions

7
推荐指数
1
解决办法
4826
查看次数

触发器 - 在动态 SQL 中使用插入/删除的表

在触发器中,我试图创建一个唯一的表名(使用NEWID()),我可以存储在插入和删除的表中找到的数据。

Declare @NewID varchar(50) = Replace(convert(Varchar(50),NEWID()),'-','')
Declare @SQLStr varchar(8000)
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:无效的对象名称“插入”

我知道我可以做到:

Select * into #inserted from inserted
Set @SQLStr= 'Select * into [TMPIns' + @newID + '] from #inserted'
Exec (@SQLStr)
Run Code Online (Sandbox Code Playgroud)

但是我不想使用 TempDB,因为这些表会变得很大,而且我也觉得它是多余的。有没有办法避免创建#inserted?

trigger sql-server dynamic-sql sql-clr

7
推荐指数
1
解决办法
5760
查看次数

如何使用 EXECUTE 在动态 SQL 中使用函数参数?

我在 PostgreSQL 9.5 中编写了一个 PL/pgSQL 函数。它编译得很好,但是当我从 pgAdmin3 调用它时,它给了我一个错误。似乎用函数中传递的参数替换列的动态查询不起作用。

下面是我的功能:

CREATE OR REPLACE FUNCTION insertRecordsForNotification(username text, state     text, district text, organizationId text, bloodGroup text, status text,   approveRejectStatus text, emailSubject text, emailBody text, notificationStatus text) RETURNS boolean AS $$
DECLARE
id int;
r moyadev.user%rowtype;
_where text :=
  concat_ws(' AND '
    , CASE WHEN state IS NOT NULL THEN 'state = $2' END
    , CASE WHEN district IS NOT NULL THEN 'district = $3' END
    , CASE WHEN bloodGroup IS NOT NULL THEN …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql parameter plpgsql postgresql-9.5

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

sp_executesql 和 VARCHAR 参数的性能问题

Segments具有按 DEPARTMENT (VARCHAR(10)) 和 BDPID(VARCHAR(10)) 的索引。

第一个查询的执行时间为 34 秒

SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
FROM Customers c
LEFT JOIN Segments seg
     ON   seg.DEPARTMENT  = 'DEP345'
     AND  seg.BDPID       = c.BDPID
Run Code Online (Sandbox Code Playgroud)

当我将 DEPARTMENT 的参数移动到变量时,执行时间变为 1 秒。执行计划#2(快速)

DECLARE @dd VARCHAR(10)
SET @dd = 'DEP345'
SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
FROM Customers c
LEFT JOIN Segments seg
     ON   seg.DEPARTMENT  = @dd
     AND  seg.BDPID       = c.BDPID
Run Code Online (Sandbox Code Playgroud)

但我必须使用动态sql。当我将查询移动到 sp_execitesql 时,执行时间再次变为 34 秒。执行计划#3(慢)

EXECUTE sp_executesql
     'SELECT TOP 10 c.BDPID, seg.FINAL_SEGMENT
     FROM Customers c …
Run Code Online (Sandbox Code Playgroud)

performance sql-server dynamic-sql sql-server-2008-r2 query-performance

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

跨多个模式查询,直到执行时间未知

我有多个需要查询的模式。模式是事先未知的,例如:

  • U111
  • U222
  • U333

我需要从这些模式中的每一个中的特定表中选择这三个模式。我可以将这个查询放在这三个模式中吗?如果是这样,我如何查询它们?请记住,我不会提前知道模式名称,因此需要动态构建它们。

schema postgresql dynamic-sql plpgsql

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