我不知道这个问题是否更适合这里或 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 …
我想查找未更新特定列的存储过程。
举个例子
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 可以有多个更新语句。是否有可能获得该更新语句的表名?
如何使用字符串和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) 在使用动态 SQL 的函数中使用参数时,在 PostgreSQL 中实现通配符搜索的正确方法是什么?
作为起点,以下是 Erwin Brandstetter 在 stackoverflow 上回答不同问题的示例:
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%'.
在这种情况下,在否定 …
奇怪的问题?...也许,但我有需要。:)
我有一个存储过程,我想在任何数据库中普遍使用。存储过程生成一些动态 SQL,然后在作为此过程中的参数之一传入的数据库中执行该 SQL。
但是我想让数据库参数成为可选的,并且当没有传入数据库名称时,我希望动态 SQL 在调用过程本身的同一个数据库中执行。(请记住,此过程可以跨数据库执行,而不是在该过程本身所在的同一数据库中执行。)
我正在尝试创建一个包含动态 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) 考虑:
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 行转换失败。
在这种情况下需要做什么?
我正在看这篇关于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) 运行以下查询时,我收到以下错误消息:
无法解决 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) 如果表在模式中不包含该列,您能否给出向所有表添加一列的命令?
例如,模式schema1包含 50 个表,其中 20 个表包含名为 的列colTest。
我需要将该列添加colTest到剩余的 30 个表中。
dynamic-sql ×10
sql-server ×6
postgresql ×4
plpgsql ×3
t-sql ×2
collation ×1
cursors ×1
permissions ×1
xml ×1