我想在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) 在我的存储过程中,我在我的过程之上声明了两个表变量.现在我试图在动态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".
我试图在动态查询的字符串块之外取表,但无济于事.
所以我在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语句.我需要使用游标迭代结果.我很难搞清楚正确的语法.这就是我正在做的事情.
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)
这样做的正确方法是什么?
代码如下:
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.但我不知道怎么做.
任何人都可以帮我解决这个问题吗?
我将所有功能都保存在一个文本文件中'CREATE OR REPLACE FUNCTION somefunction'.因此,如果我添加或更改某些功能,我只需将文件提供给psql.
现在,如果我向现有函数添加或删除参数,它会创建一个具有相同名称的重载,并按照确切的顺序删除所有参数类型中的原始I类型,这是一种单调乏味的操作.
是否有某种通配符,我可以使用DROP具有给定名称的所有函数,所以我可以添加DROP FUNCTION行到我的文件的顶部?
我刚刚问了一个与SQL相关的问题,第一个答案是:" 这是一种动态SQL可行的方式. "
因为我之前从未听说过动态SQL,所以我立即搜索了这个网站和网页.Wikipedia没有关于此标题的文章.第一个Google结果都指向用户论坛,人们会在这些论坛中提出或多或少的相关问题.
但是,我没有找到"动态SQL"是什么的明确定义.这是供应商特定的吗?我使用MySQL并且我没有在MySQL手册中找到参考(只有问题,在MySQL用户论坛中大多没有答案).
另一方面,我发现许多对存储过程的引用.虽然我从未使用过任何存储过程,但我对存储过程的掌握稍微好一些.这两个概念有何关联?它们是相同的还是使用另一个?
基本上,我们需要的是对这个概念不熟悉的人简单介绍动态SQL.
PS:如果你有这种感觉,你可能会回答我之前提出过这个问题的问题:SQL:我们怎样才能在table1的字段中给出一个table1 JOIN table2?
我写了一个函数,输出一个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 …
我不确定如何实现以下内容:
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值). …
我正在尝试使用SQL语句切换当前数据库.我尝试了以下方法,但所有尝试都失败了:
添加更多细节.
编辑:我想在两个单独的数据库上执行几项操作,其中两个数据库都配置了变量.像这样的东西:
USE Database1
SELECT * FROM Table1
USE Database2
SELECT * FROM Table2
Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
plpgsql ×4
postgresql ×4
sql ×4
sql-server ×3
t-sql ×2
database ×1
function ×1
identifier ×1
mysql ×1
sql-drop ×1
triggers ×1