标签: dynamic-sql

PL/pgSQL 函数创建中的错误

我不知道这个问题是否更适合这里或 SO ...

这是我想启动的脚本(该函数的代码是从 SO 上的一个问题复制的):

\c mydb

create or replace function truncate_tables(username in varchar) returns void as $$
declare
    stmt RECORD;
    statements cursor for select tablename from pg_tables where tableowner = username;
begin 
    for stmt in statements loop
        execute 'truncate table ' || quote_ident(stmt.tablename) || ' CASCADE ;';
    end loop;
end;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

ERROR: syntax at or near "$1"    LINE1:   $1
QUERY $1
CONTEXT: SQL statement in PL/PgSQL function "truncate_tables" near line 5
Run Code Online (Sandbox Code Playgroud)

我是 Postgres …

postgresql dynamic-sql cursors plpgsql postgresql-8.3

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

查找特定列未更新的所有 SP

我想查找未更新特定列的存储过程。

举个例子

SP1 :

BEGIN
      UPDATE YourTable
      SET    Foo = @Foo,
             Bar = @Bar
      WHERE  Id = @Id
  END 
Run Code Online (Sandbox Code Playgroud)

SP2 :

 BEGIN
      UPDATE YourTable
      SET    Foo = @Foo                 
      WHERE  Id = @Id
  END 
Run Code Online (Sandbox Code Playgroud)

因此,我想获取Bar上面示例中未更新的所有 SP,它应该返回SP2.

注意:一个 SP 可以有多个更新语句。是否有可能获得该更新语句的表名?

sql-server dynamic-sql

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

使用动态 SQL 重置串行 PK 的顺序

如何使用字符串和DECLARE变量的组合动态引用序列名称(如下所示)?下面的代码是否正确或者是否有其他方法可以做到这一点?

DO我的目标是出于性能原因在/块中执行此操作BEGIN,而且它将通过做一些有用的事情来帮助我理解 plpgsql,因此除非确实必须,否则我不会将其混合到 PHP 中。

DO $$
 DECLARE PKEY VARCHAR;
BEGIN

SELECT pg_attribute.attname INTO PKEY 
FROM pg_index, pg_class, pg_attribute 
WHERE pg_class.oid = 'parts1'::regclass 
AND indrelid = pg_class.oid 
AND pg_attribute.attrelid = pg_class.oid 
AND pg_attribute.attnum = any(pg_index.indkey) 
AND indisprimary;

--SELECT setval('parts1_id_seq', (SELECT MAX(pkey) + 1 FROM parts));
SELECT setval('parts1_' || PKEY || '_seq', (SELECT MAX(pkey) + 1 FROM parts));

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

postgresql auto-increment dynamic-sql plpgsql

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

使用动态 SQL 函数中的参数进行通配符搜索

在使用动态 SQL 的函数中使用参数时,在 PostgreSQL 中实现通配符搜索的正确方法是什么?

作为起点,以下是 Erwin Brandstetter 在 stackoverflow 上回答不同问题的示例:

/sf/answers/843309421/

CREATE OR REPLACE FUNCTION report_get_countries_new (starts_with text
                                                   , ends_with   text = NULL)
RETURNS SETOF lookups.countries AS
$func$
DECLARE
   sql text := 'SELECT * FROM lookups.countries WHERE country_name >= $1';
BEGIN
   IF ends_with IS NOT NULL THEN
      sql := sql || ' AND country_name <= $2';
   END IF;

   RETURN QUERY EXECUTE sql
   USING starts_with, ends_with;
END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

假设country_name您想要进行前导和尾随通配符搜索。

例如,不使用参数,AND country_name LIKE '%ic%'.

在这种情况下,在否定 …

postgresql sql-injection dynamic-sql plpgsql

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

如何在存储过程执行时获取在该存储过程中执行的数据库的名称?

奇怪的问题?...也许,但我有需要。:)

我有一个存储过程,我想在任何数据库中普遍使用。存储过程生成一些动态 SQL,然后在作为此过程中的参数之一传入的数据库中执行该 SQL。

但是我想让数据库参数成为可选的,并且当没有传入数据库名称时,我希望动态 SQL 在调用过程本身的同一个数据库中执行。(请记住,此过程可以跨数据库执行,而不是在该过程本身所在的同一数据库中执行。)

sql-server stored-procedures dynamic-sql sql-server-2008-r2

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

存储过程错误“必须声明标量变量”

我正在尝试创建一个包含动态 SQL 的存储过程。proc 接收 5 个变量,其中 3 个是列和字段的名称,另外 2 个用于 OFFSET 和 FETCH NEXT 部分。我在最后两个变量上不断收到此错误:

消息 137,级别 15,状态 2,第 34 行 必须声明标量变量“@numOfOffset”。消息 137,级别 15,状态 2,第 34 行 必须声明标量变量“@numOfRows”。

我会感谢一些帮助,请

IF (SELECT 1 FROM sys.procedures WHERE [name] = 'sp_targil1') = 1
    DROP PROCEDURE sp_targil1;
GO

CREATE PROCEDURE sp_targil1 (@tableName varchar(30), @fieldNameAggBy varchar(30), @fieldNameToAggOn varchar(30)
    ,  @numOfOffset int, @numOfRows int
    )
AS
BEGIN
    DECLARE @query1 varchar(500)
    DECLARE @qaeryMain varchar(500)
    DECLARE @maxNumberOfRows int

    SET @qaeryMain = 
    '
    SELECT ' + @fieldNameAggBy + ', …
Run Code Online (Sandbox Code Playgroud)

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

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

动态 SQL 查询 - 如何将 int 添加到代码中?

考虑:

Declare @stringsvar varchar(1000)
Declare @Emp_id int 
DECLARE  @strvar SYSNAME = 'Employee_test'

SET @stringsvar = ('select * from' + ' ' + @strvar + ' where emp_id' + ' =' + @Emp_id)
Print @stringsvar
Run Code Online (Sandbox Code Playgroud)

上面的查询给出了如下所述的错误:

将 nvarchar 值 'select * from Employee_test where emp_id =' 转换为数据类型 int 时,消息 245,级别 16,状态 1,第 17 行转换失败。

在这种情况下需要做什么?

sql-server sql-injection dynamic-sql t-sql

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

SQL Server:递归动态 SQL 难题

我正在看这篇关于trim all columns of a table 的帖子。在答案查询脚本中,列名被连接起来,没有任何循环操作。我简化了它以检查其工作流程,如下所述。

  • 创建一个新的数据库

  • 创建一个包含三列的新表,如下面的脚本所示。(不需要插入值)

    Create table table1(id int, name varchar(20), city varchar(20))
    
    Run Code Online (Sandbox Code Playgroud)

    在 T-SQL 脚本下面执行,结果xxx [id] [name] [city] 是单行。

    Declare @a as varchar(4000)
    SET @a = 'xxx '
    SELECT @a = @a + '['+COLUMN_NAME+'] ' FROM INFORMATION_SCHEMA.COLUMNS 
    SELECT @a
    
    Run Code Online (Sandbox Code Playgroud)

以下脚本导致 3 行

Declare @a as varchar(4000)
SET @a = 'xxx '
SELECT 'b' = @a + '['+COLUMN_NAME+'] ' FROM INFORMATION_SCHEMA.COLUMNS 
Run Code Online (Sandbox Code Playgroud)

为了更好地理解,我使用Top 1. 这结果xxx [id]

Declare @a as varchar(4000)
SET …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql

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

运行动态 sql FOR XML PATH 时的排序规则冲突

运行以下查询时,我收到以下错误消息:

无法解决 equal to 操作中“Latin1_General_CI_AS”和“Latin1_General_BIN”之间的排序冲突

此查询工作正常,基本上为我提供了在当前数据库中创建用户的脚本。

为了在当前服务器中的所有(或选择)数据库中运行查询,我通过动态 SQL 和 XML PATH 完成了它。

问题是,当我取消注释下面脚本的 XML 部分时,出现上面的错误。

我不是在所有服务器中都收到此错误。有些服务器工作正常,有些则陷入困境。

我希望此查询可以在所有服务器中运行,而与服务器排序规则无关。

我怎样才能做到这一点?

DECLARE @sql NVARCHAR(MAX)
DECLARE @ParamDefinition NVARCHAR(MAX)

    DECLARE  @log NVARCHAR(MAX)
            ,@vCrlf CHAR(2);

    SELECT  @log = ''
           ,@vCrlf = CHAR(13)+CHAR(10);



SELECT @SQL = '
--==========================================
-- creating the users
--==========================================

select  db = db_name(),
         _login=[master].[sys].[server_principals].[name],
         role_= null,
         obj=null,
        Permission= null,
        [script]=
''CREATE USER [''       
 + [sys].[database_principals].[name] + '']'' + '' FOR LOGIN ['' + [master].[sys].[server_principals].[name] + '']'' 

from [sys].[database_principals] INNER JOIN [master].[sys].[server_principals]
on [sys].[database_principals].[name]=[master].[sys].[server_principals].[name] …
Run Code Online (Sandbox Code Playgroud)

xml sql-server collation permissions dynamic-sql

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

向模式中的所有表添加列的命令

如果表在模式中不包含该列,您能否给出向所有表添加一列的命令?

例如,模式schema1包含 50 个表,其中 20 个表包含名为 的列colTest

我需要将该列添加colTest到剩余的 30 个表中。

postgresql dynamic-sql postgresql-9.4

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