标签: dynamic-sql

表名作为PostgreSQL函数参数

我想在Postgres函数中传递一个表名作为参数.我试过这段代码:

CREATE OR REPLACE FUNCTION some_f(param character varying) RETURNS integer 
AS $$
    BEGIN
    IF EXISTS (select * from quote_ident($1) where quote_ident($1).id=1) THEN
     return 1;
    END IF;
    return 0;
    END;
$$ LANGUAGE plpgsql;

select some_f('table_name');
Run Code Online (Sandbox Code Playgroud)

我得到了这个:

ERROR:  syntax error at or near "."
LINE 4: ...elect * from quote_ident($1) where quote_ident($1).id=1)...
                                                             ^

********** Error **********

ERROR: syntax error at or near "."
Run Code Online (Sandbox Code Playgroud)

以下是更改为此时出现的错误select * from quote_ident($1) tab where tab.id=1:

ERROR:  column tab.id does not exist
LINE 1: ...T EXISTS …
Run Code Online (Sandbox Code Playgroud)

postgresql function dynamic-sql plpgsql identifier

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

如何在动态sql语句中使用表变量?

在我的存储过程中,我在我的过程之上声明了两个表变量.现在我试图在动态sql语句中使用该表变量,但是在执行该过程时出现此错误.我正在使用Sql Server 2008.

这是我的查询的样子,

set @col_name =  'Assoc_Item_' 
              + Convert(nvarchar(2), @curr_row1);

set @sqlstat = 'update @RelPro set ' 
             + @col_name 
             + ' = (Select relsku From @TSku Where tid = ' 
             + Convert(nvarchar(2), @curr_row1) + ') Where RowID = ' 
             + Convert(nvarchar(2), @curr_row);

Exec(@sqlstat);
Run Code Online (Sandbox Code Playgroud)

我得到以下错误,

必须声明表变量"@RelPro".必须声明表变量"@TSku".

我试图在动态查询的字符串块之外取表,但无济于事.

sql sql-server dynamic-sql table-variable sql-server-2008

61
推荐指数
4
解决办法
16万
查看次数

nvarchar(max)仍然被截断

所以我在MS SQL Server 2008中编写了一个存储过程.这是一个非常长的查询,我必须动态编写它,所以我创建一个名为的变量@Query并使其成为类型NVARCHAR(MAX).现在,我被告知在现代版本的SQL Server中,NVARCHAR(MAX)可以容纳一大堆数据,比最初的4000个字符最多.但是,@Query当我尝试将其打印出来时,仍会被截断为4000个字符.

DECLARE @Query NVARCHAR(max);
SET @Query = 'SELECT...' -- some of the query gets set here
SET @Query = @Query + '...' -- more query gets added on, etc.

-- later on...
PRINT LEN(@Query) -- Prints out 4273, which is correct as far as I can tell
PRINT @Query      -- Truncates value to 4000 characters
EXEC sp_executesql @Query -- totally crashes due to malformed (truncated) query …
Run Code Online (Sandbox Code Playgroud)

sql dynamic-sql sql-server-2008

52
推荐指数
6
解决办法
10万
查看次数

在存储过程中使用带有动态SQL的游标

我有一个我在存储过程中创建的动态SQL语句.我需要使用游标迭代结果.我很难搞清楚正确的语法.这就是我正在做的事情.

SELECT @SQLStatement = 'SELECT userId FROM users'

DECLARE @UserId

DECLARE users_cursor CURSOR FOR
EXECUTE @SQLStatment --Fails here. Doesn't like this

OPEN users_cursor
FETCH NEXT FROM users_cursor
INTO @UserId

WHILE @@FETCH_STATUS = 0
BEGIN

EXEC asp_DoSomethingStoredProc @UserId

END
CLOSE users_cursor
DEALLOCATE users_cursor
Run Code Online (Sandbox Code Playgroud)

这样做的正确方法是什么?

t-sql stored-procedures dynamic-sql database-cursor

46
推荐指数
2
解决办法
20万
查看次数

动态SQL在SQL存储过程中生成临时表

代码如下:

ALTER PROCEDURE dbo.pdpd_DynamicCall 
@SQLString varchar(4096) = null

AS

Begin

    create TABLE #T1 ( column_1 varchar(10) , column_2 varchar(100) )

    insert into #T1 
        execute ('execute ' + @SQLString )

    select * from #T1 

End
Run Code Online (Sandbox Code Playgroud)

问题是我想调用可以返回不同列的不同过程.因此,我必须一般地定义表#T1.但我不知道怎么做.

任何人都可以帮我解决这个问题吗?

t-sql sql-server dynamic-sql

44
推荐指数
5
解决办法
17万
查看次数

DROP FUNCTION不知道参数的数量/类型?

我将所有功能都保存在一个文本文件中'CREATE OR REPLACE FUNCTION somefunction'.因此,如果我添加或更改某些功能,我只需将文件提供给psql.

现在,如果我向现有函数添加或删除参数,它会创建一个具有相同名称的重载,并按照确切的顺序删除所有参数类型中的原始I类型,这是一种单调乏味的操作.

是否有某种通配符,我可以使用DROP具有给定名称的所有函数,所以我可以添加DROP FUNCTION行到我的文件的顶部?

postgresql dynamic-sql plpgsql sql-drop

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

什么是动态SQL?

我刚刚问了一个与SQL相关的问题,第一个答案是:" 这是一种动态SQL可行的方式. "

因为我之前从未听说过动态SQL,所以我立即搜索了这个网站和网页.Wikipedia没有关于此标题的文章.第一个Google结果都指向用户论坛,人们会在这些论坛中提出或多或少的相关问题.

但是,我没有找到"动态SQL"是什么的明确定义.这是供应商特定的吗?我使用MySQL并且我没有在MySQL手册中找到参考(只有问题,在MySQL用户论坛中大多没有答案).

另一方面,我发现许多对存储过程的引用.虽然我从未使用过任何存储过程,但我对存储过程的掌握稍微好一些.这两个概念有何关联?它们是相同的还是使用另一个?

基本上,我们需要的是对这个概念不熟悉的人简单介绍动态SQL.

PS:如果你有这种感觉,你可能会回答我之前提出过这个问题的问题:SQL:我们怎样才能在table1的字段中给出一个table1 JOIN table2?

mysql sql stored-procedures dynamic-sql

32
推荐指数
4
解决办法
2万
查看次数

重构PL/pgSQL函数以返回各种SELECT查询的输出

我写了一个函数,输出一个SELECT以文本形式组成的PostgreSQL 查询.现在我不想再输出文本,但实际上SELECT对数据库运行生成的语句并返回结果 - 就像查询本身一样.

到目前为止我所拥有的:

CREATE OR REPLACE FUNCTION data_of(integer)
  RETURNS text AS
$BODY$
DECLARE
   sensors varchar(100);   -- holds list of column names
   type    varchar(100);   -- holds name of table
   result  text;           -- holds SQL query
       -- declare more variables

BEGIN
      -- do some crazy stuff

      result := 'SELECT\r\nDatahora,' || sensors ||
      '\r\n\r\nFROM\r\n' || type ||
      '\r\n\r\nWHERE\r\id=' || $1 ||'\r\n\r\nORDER BY Datahora;';

      RETURN result;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION data_of(integer) OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

sensors …

sql database postgresql dynamic-sql plpgsql

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

在触发器函数中使用动态表名INSERT

我不确定如何实现以下内容:

CREATE OR REPLACE FUNCTION fnJobQueueBEFORE() RETURNS trigger AS $$
    DECLARE
        shadowname varchar := TG_TABLE_NAME || 'shadow';
    BEGIN
        INSERT INTO shadowname VALUES(OLD.*);
        RETURN OLD;
    END;
$$
LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

即将值插入到具有动态生成名称的表中.
执行上面的代码会产生:

ERROR:  relation "shadowname" does not exist
LINE 1: INSERT INTO shadowname VALUES(OLD.*)
Run Code Online (Sandbox Code Playgroud)

它似乎表明变量不会作为表名扩展/允许.我在Postgres手册中没有发现这个.

我已经尝试过EXECUTE这样的事情:

  EXECUTE 'INSERT INTO ' || quote_ident(shadowname) || ' VALUES ' || OLD.*;
Run Code Online (Sandbox Code Playgroud)

但没有运气:

ERROR:  syntax error at or near ","
LINE 1: INSERT INTO personenshadow VALUES (1,sven,,,)
Run Code Online (Sandbox Code Playgroud)

RECORD类型似乎失去了:OLD.*似乎被转换为字符串,并得到的重新解析,导致各种各样的类型的问题(例如NULL值). …

postgresql triggers dynamic-sql plpgsql

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

sql使用带变量的语句

我正在尝试使用SQL语句切换当前数据库.我尝试了以下方法,但所有尝试都失败了:

  1. 使用@DatabaseName
  2. EXEC sp_sqlexec @Sql - 其中@Sql ='USE ['+ @DatabaseName +']'

添加更多细节.

编辑:我想在两个单独的数据库上执行几项操作,其中两个数据库都配置了变量.像这样的东西:

USE Database1
SELECT * FROM Table1

USE Database2
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2005 dynamic-sql

26
推荐指数
5
解决办法
9万
查看次数