标签: dynamic-sql

如何根据传递到存储过程的参数更改 ORDER BY 子句

我将 3 个参数传递到我的存储过程中:@Time, @DeptID, @Value

  1. @Time代表:1=过去24小时,2=过去一周,3=过去一个月,4=过去一年
  2. @DeptID是各个部门的ID
  3. @Value1=按低位排序,2=按高位排序

这是我当前的代码:

DECLARE @SQL VARCHAR(MAX)
SET @SQL = ('SELECT S.ID, S.[Description], D.Department, S.Value, S.[Date] FROM Suggestions S INNER JOIN Department D ON D.ID = S.DeptID WHERE Approved =1')

IF (@DeptID = 0 AND @Value = 0 AND @Time = 0)
    BEGIN
        SET @SQL = (@SQL +' ORDER BY [Date] DESC')
    END

IF (@Time > 0)
   BEGIN
    SET @SQL = (CASE WHEN @Time = 1 THEN (@SQL + ' …
Run Code Online (Sandbox Code Playgroud)

sql sql-server stored-procedures dynamic-sql sql-order-by

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

动态游标 Oracle

我想创建一个动态游标,但我的代码没有给我带来正确的数据。我究竟做错了什么?

DECLARE
 VAR1 VARCHAR2(500);
 CURSOR CUR1 IS
  SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN (VAR1);

 BEGIN
  VAR1 := q'['V1','V2']';
  FOR REG IN CUR1 LOOP
   DBMS_OUTPUT.PUT_LINE(REG.COL1);
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql

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

如何在触发器函数中将 NEW.* 传递给 EXECUTE

我有一个简单的任务是将巨大的 MD5 值插入到表(分区表)中,并创建了一个触发器和一个触发器函数来代替INSERT操作。在函数中,我检查了前两个字符NEW.md5以确定应插入哪个表。

DECLARE
  tb text;
BEGIN
  IF TG_OP = 'INSERT' THEN
    tb = 'samples_' || left(NEW.md5, 2);
    EXECUTE(format('INSERT INTO %s VALUES (%s);', tb, NEW.*)); <- WRONG
  END IF;
  RETURN NULL;
END;
Run Code Online (Sandbox Code Playgroud)

问题是如何连接NEW.*到SQL语句中?

postgresql triggers dynamic-sql plpgsql

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

如何在 PostgreSQL 中执行动态查询?

我正在尝试执行以下动态 sql,但我不知道该怎么做:

DROP FUNCTION f_mycross(text, text);

EXECUTE ('CREATE OR REPLACE FUNCTION f_mycross(text, text)
   RETURNS TABLE ("registration_id" integer, '
   || (SELECT string_agg(DISTINCT pivot_headers, ',' order by pivot_headers)
       FROM (SELECT DISTINCT '"' || qid::text || '" text' AS pivot_headers
             FROM answers) x)
   || ') AS ''$libdir/tablefunc'',''crosstab_hash'' LANGUAGE C STABLE STRICT;')
Run Code Online (Sandbox Code Playgroud)

我对 PostgreSQL 比较陌生。

postgresql dynamic-sql postgresql-9.3

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

如何在 SQL Server 中删除数据库架构和用户

我有一个 sql 代码来删除架构和用户,见下文:

 USE [DB1]
GO
--SELECT * FROM sys.schemas s WHERE s.principal_id = USER_ID('ITAdmin')
WHILE EXISTS (SELECT * FROM sys.schemas s WHERE s.principal_id = USER_ID('ITAdmin'))
BEGIN
    DECLARE @tmpSchemaHolderToBeDroppedOrChanged NVARCHAR(100), @tmpAlterSchemaAuthorisationStatement NVARCHAR(200)
    SET @tmpAlterSchemaAuthorisationStatement = 'DROP SCHEMA '
    SET @tmpSchemaHolderToBeDroppedOrChanged = (SELECT TOP 1 s.name FROM sys.schemas s WHERE s.principal_id = USER_ID('ITAdmin'))
    IF @tmpSchemaHolderToBeDroppedOrChanged = 'ITAdmin'
    BEGIN
            PRINT 'Dropping ITAdmin schema.'
            IF schema_id('ITAdmin') IS NOT NULL
            BEGIN
                    DROP SCHEMA ITAdmin;
                    PRINT 'ITAdmin schema has been dropped.'
            END
    END
    ELSE
    BEGIN …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server dynamic-sql

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

在动态sql PostgreSQL中创建函数

是否可以在 PostgreSQL 的动态 SQL 中创建函数或执行匿名块?我正在寻找这样的东西:

Create or replace FUNCTION fff(p1 int)
LANGUAGE  plpgsql
  AS $$
  DECLARE
   v_Qry  VARCHAR(4000);
  BEGIN
    v_Qry := '
    Create or replace FUNCTION fff_DYNAMIC_SQL()
    LANGUAGE  plpgsql
    AS $$
    DECLARE
    v1  INTEGER;
    begin
     v1 := ' || p1 || ';
     RETURN;
    END; $$;';
   EXECUTE v_Qry;
   RETURN;
END; $$;
Run Code Online (Sandbox Code Playgroud)

sql postgresql dynamic-sql

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

使用类型(“TEXT”)的字符串表示形式将值转换为类型(TEXT)

我想创建一个函数,尝试将一组值转换为用户指定的类型(默认为文本)。一个非常简单的函数如下所示:

CREATE OR REPLACE FUNCTION cast_to(variable jsonb, key text, target_type anyelement DEFAULT 'TEXT'::regtype) RETURNS anyelement as $$
begin
    RETURN CAST(variable->>key AS target_type);
end
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)

我已经尝试过以下方法:

  1. SELECT CAST('foo' AS 'text');: 给出语法错误
  2. SELECT CAST('foo' AS 'text'::regtype);: 与 1 相同的错误
  3. SELECT CAST('foo' AS pg_typeof(null::text));type pg_typeof does not exist

最后一次尝试是我可以传入一个具有目标类型的变量而不是文本表示形式。使用该函数将如下所示SELECT cast_to('text', NULL::text);

如何实现这个或类似的功能?

编辑:正如评论中所建议的,我尝试使用动态 SQL。我运气不太好。我创建了一个非常基本的案例,不使用任何变量:

CREATE OR REPLACE FUNCTION audit.cast_to() RETURNS text as $$
DECLARE 
_sql TEXT := 'SELECT CAST($1 AS $2)';
out TEXT;
begin …
Run Code Online (Sandbox Code Playgroud)

sql postgresql polymorphism dynamic-sql plpgsql

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

BigQuery 脚本通过联合查询将 google cloud postgres 表复制到 BigQuery

我有一个 google cloud postgres 实例,我正在尝试将架构中的所有表复制到单独的 google bigquery 表中,并使用运行联合查询的脚本,该脚本将安排在某个时间间隔运行。我正在使用 information_schema 中的数据,因为我希望脚本也能够选择新添加的表。

假设分析模式有 4 个表。

analytics.table1
analytics.table2
analytics.table3
analytics.table4
Run Code Online (Sandbox Code Playgroud)

下面的示例代码生成分析架构中所有表的列表,并将其设置为变量名称“table_name”。

DECLARE table_name ARRAY<STRING>;

SET table_name=(
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>",
    "select table_schema||'.'||table_name as table_name from information_schema.tables 
        where table_schema='analytics';");
);
Run Code Online (Sandbox Code Playgroud)

我对该脚本的目的是使用以下查询创建四个单独的 bigquery 表

CREATE TABLE analytics.table1 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table1");

CREATE TABLE analytics.table2 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table2");

CREATE TABLE analytics.table3 AS
SELECT * FROM EXTERNAL_QUERY("<your_connection_id>", "SELECT * FROM analytics.table3");

CREATE TABLE analytics.table4 AS
SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql google-bigquery

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

动态 SQL 存储过程和日期时间

我有一个简单的查询,我想将其转换为动态 SQL。我有 2 个输入参数:一个表和一个日期时间。输出是表的行计数和这个特定的日期时间。

CREATE PROCEDURE [etl].[ROWCOUNT_TST2]
    (@P_LOAD_TARGET nvarchar(250),
     @P_LOAD_DATE DATETIME)
AS
BEGIN
    DECLARE @SQL nvarchar(1000)

    SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM ='''+  @P_LOAD_DATE+''' AND VALID_TO IS NULL'

    EXEC  (@SQL)
END;
GO
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的解决方案。我尝试使用execute进行查询sp_executesql,我在.之前和之后添加了''' @P_LOAD_DATE。我可能在这里遗漏了一些东西。

当我使用表名和日期时间执行存储过程(如 )时2021-05-06 06:41:52.557,出现以下错误:

从字符串转换日期和/或时间时转换失败。

但为什么?

我什至尝试像这样添加到日期时间的转换,但我仍然遇到相同的错误。

 SET @SQL = 'SELECT COUNT(*) as Inserted FROM'+@P_LOAD_TARGET +' WHERE VALID_FROM = convert(datetime,'''+  @P_LOAD_DATE+''') AND VALID_TO IS NULL'
Run Code Online (Sandbox Code Playgroud)

但是当我执行 SELECT Convert(datetime, '2021-05-06 06:41:52.557') 时效果很好。我现在很困惑,找不到问题的根源。

编辑:valid_from是目标表中的日期时间。所以这也不是问题的原因

sql t-sql sql-server dynamic-sql

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

截断 Postgres 中除列表中提供的表之外的所有表

我想截断整个数据库,同时保持序列同一性。我想出了这样的事情:

WITH tables_to_be_truncated AS (
SELECT table_name
    FROM information_schema.tables
    WHERE table_type='BASE TABLE'
    AND table_schema='public'
    AND table_name NOT IN ('admins', 'admin_roles')
)
TRUNCATE TABLE (SELECT table_name FROM tables_to_be_truncated) CONTINUE IDENTITY RESTRICT;
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

ERROR:  syntax error at or near "TRUNCATE"
LINE 9: TRUNCATE TABLE (SELECT table_name FROM tables_to_be_truncated...
Run Code Online (Sandbox Code Playgroud)

我确实有权截断表,并且当我运行单个表时,TRUNCATE TABLE access_tokens它工作得很好。

我也尝试过这个

ERROR:  syntax error at or near "TRUNCATE"
LINE 9: TRUNCATE TABLE (SELECT table_name FROM tables_to_be_truncated...
Run Code Online (Sandbox Code Playgroud)

但效果不太好。

从我在其他帖子中看到的情况来看,人们正在用函数来做这件事。老实说,我不想走这条路,但如果这是唯一的方法......

postgresql truncate dynamic-sql

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