我将 3 个参数传递到我的存储过程中:@Time, @DeptID, @Value。
@Time代表:1=过去24小时,2=过去一周,3=过去一个月,4=过去一年@DeptID是各个部门的ID@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) 我想创建一个动态游标,但我的代码没有给我带来正确的数据。我究竟做错了什么?
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) 我有一个简单的任务是将巨大的 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语句中?
我正在尝试执行以下动态 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 比较陌生。
我有一个 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) 是否可以在 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) 我想创建一个函数,尝试将一组值转换为用户指定的类型(默认为文本)。一个非常简单的函数如下所示:
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)
我已经尝试过以下方法:
SELECT CAST('foo' AS 'text');: 给出语法错误SELECT CAST('foo' AS 'text'::regtype);: 与 1 相同的错误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) 我有一个 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) 我有一个简单的查询,我想将其转换为动态 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是目标表中的日期时间。所以这也不是问题的原因
我想截断整个数据库,同时保持序列同一性。我想出了这样的事情:
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)
但效果不太好。
从我在其他帖子中看到的情况来看,人们正在用函数来做这件事。老实说,我不想走这条路,但如果这是唯一的方法......
dynamic-sql ×10
postgresql ×6
sql ×4
sql-server ×3
plpgsql ×2
t-sql ×2
oracle ×1
plsql ×1
polymorphism ×1
sql-order-by ×1
triggers ×1
truncate ×1