我可以在事务中运行动态sql并使用EXEC回滚:
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
Run Code Online (Sandbox Code Playgroud)
将它放在一个Transaction中,并在exec语句之后使用@@ error来进行回滚.
例如.码
BEGIN TRANSACTION
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
IF @@ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
ELSE
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
如果有n个动态sql语句且错误发生在n/2中,则会回滚前1到((n/2) - 1)个语句
关于第一个答案的问题
@@错误不会发现最有可能的错误这意味着它可能没有收到错误,这意味着事务可能会提交?这打败了目的
SQL Server 2005+中的TRY/CATCH是的我使用的是SQL Server 2005,但之前没有使用过Try Catch会做下面的操作
BEGIN TRANSACTION
BEGIN TRY
exec('SELECT * FROM TableA; SELECT * FROM TableB;');
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
Run Code Online (Sandbox Code Playgroud)
或者我在网上看了一些更多的例子
BEGIN TRY --Start the Try Block..
BEGIN TRANSACTION -- Start the transaction.. …Run Code Online (Sandbox Code Playgroud) 我记得在那一天我会做出一大堆nvarchar(4000)vars,随着它们的成长检查它们的长度,在它们填满时将它们切换出来然后将整个混乱连接在一起以进行exec调用.我想知道是否有更简单的方法.
谢谢!
编辑:
代码示例,显示我搞砸了案例陈述
DECLARE @sql NVARCHAR(MAX)
SELECT @sql = CAST(N'SELECT ' AS NVARCHAR(MAX))
DECLARE @Index INT
SELECT @Index = 0
WHILE (@Index < 1000)
BEGIN
SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(N' ' AS NVARCHAR(MAX)) + CAST( CASE @Index WHEN 1 THEN N' ' END AS NVARCHAR(MAX))
SELECT @Index = @Index + 1
END
SELECT @sql = CAST(@sql AS NVARCHAR(MAX)) + CAST(1 AS NVARCHAR(MAX))
SELECT LEN(@sql)
EXECUTE sp_executesql @sql
Run Code Online (Sandbox Code Playgroud) 我发现了一些用于动态排序和订单的优秀sql代码,但我想知道是否有人可以帮我重新设置它以便下面PROC中的CTE使用动态排序/顺序.此代码运行 - 但输出不是我所追求的,因为ORDER BY p.ProductId首先在CTE中发生,然后ORDER BY CASE语句仅适用于记录6到10
DECLARE @Skip int
DECLARE @Take int
DECLARE @OrderBy VARCHAR(50)
SET @Skip = 5;
SET @Take = 5;
SET @OrderBy = 'PriceAsc';
WITH ProductCT AS
(
SELECT ROW_NUMBER() OVER(ORDER BY p.ProductId) AS RowNum
, p.ProductId
FROM dbo.Product AS p
)
SELECT p.ProductId
,p.Title
,p.Price
FROM dbo.Product AS p
INNER JOIN ProductCT AS pct ON pct.ProductId = p.ProductId
WHERE pct.RowNum BETWEEN @Skip + 1 AND (@Skip + @Take)
ORDER BY
CASE
WHEN @OrderBy = 'TitleAsc' …Run Code Online (Sandbox Code Playgroud) 首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html
所以我的问题:
我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量.我正在使用Ado.Net提供商.
在Oracle中,解决方案将包含4个步骤:
我怎么能用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助可以迁移到devard.
我从Trigger调用存储过程,我收到以下错误:
存储函数或触发器中不允许使用动态SQL
为什么会发生这种情况,动态SQL正在存储过程中执行,该过程从触发器调用.也许这就是问题,如果有的话有什么办法吗?
编辑(添加代码):
这是主表中的Trigger:
-- Trigger DDL Statements
DELIMITER $$
USE `TestaDataBase`$$
CREATE TRIGGER `TestaDataBase`.`UpdateAuxilaryTable`
AFTER INSERT ON `MainTable` FOR EACH ROW
BEGIN
/* Here we call stored procedure with parameter id of newly inserted row. */
CALL TestProcedure('Year', 'Person', 'IdPerson', NEW.IdData);
END
$$
Run Code Online (Sandbox Code Playgroud)
这是从触发器调用的存储过程:
DELIMITER $$
CREATE PROCEDURE `TestDataBase`.`TestProcedure` (IN attribute CHAR(64), IN tableName CHAR(64), IN IdTable CHAR(64), IN IdLastRow MEDIUMINT)
BEGIN
DECLARE selectedValue MEDIUMINT;
SET @statement = CONCAT('SELECT ', attribute, ' FROM ', tableName, ' WHERE ', …Run Code Online (Sandbox Code Playgroud) 在MySQL中,我们可以使用生成预准备语句PreparedStatement.
我想在SQL脚本中实现相同的功能.如何创建预准备语句以及如何执行它?请举例说明.
我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如:
create or replace function pg_temp.testtst ()
returns varchar(255) as
$$
declare
r record; t_name name;
begin
for r in SELECT tablename FROM pg_tables WHERE schemaname = 'public' limit 100 loop
t_name = r.tablename;
update t_name set id = 10 where id = 15;
end loop;
return seq_name;
end;
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)
它显示 ERROR:关系"t_name"不存在
原始表的规则存储在一个名为md_formula的表中,该表用于映射到目标表中
放置/创建/插入以下内容raw_dbs_transactiondetailscash:
DROP TABLE raw_dbs_transactiondetailscash
CREATE TABLE raw_dbs_transactiondetailscash(
accountnumber VARCHAR(100),
referencecurrency VARCHAR(100),
transactiondate datetime)
INSERT INTO raw_dbs_transactiondetailscash(
accountnumber, referencecurrency, transactiondate)
SELECT 'XYZ','$','01/01/2016'
Run Code Online (Sandbox Code Playgroud)
放置/创建/插入以下内容md_formula:
DROP TABLE MD_Formula
CREATE TABLE MD_Formula (
Format VARCHAR(20),
tbl_Src VARCHAR(200),
Col_src VARCHAR(500),
tbl_Des VARCHAR(200),
Col_des VARCHAR(100),
Condition VARCHAR(500) )
INSERT INTO md_formula(format, tbl_src, Col_src, tbl_des,Col_des)
SELECT 'Dbs','raw_dbs_transactiondetailscash','accountnumber',
'normalized_transaction','account_number'
UNION ALL
SELECT 'Dbs','raw_dbs_transactiondetailscash','referencecurrency',
'normalized_transaction','currency'
UNION ALL
SELECT 'Dbs','raw_dbs_transactiondetailscash','transactiondate',
'normalized_transaction','trade_date'
Run Code Online (Sandbox Code Playgroud)
从存储在md_Formula中的原始表中获取数据TSQL(例如,仅选择一列)
这实际上会执行
SELECT accountnumber
FROM raw_dbs_transactiondetailscash
Run Code Online (Sandbox Code Playgroud)
并从raw_dbs_transactiondetailscash表中获取数据集
DECLARE @sql VARCHAR(100) …Run Code Online (Sandbox Code Playgroud) I have a SELECT query on a view, that contains 500.000+ rows. Let's keep it simple:
SELECT * FROM dbo.Document WHERE MemberID = 578310
Run Code Online (Sandbox Code Playgroud)
The query runs fast, ~0s
Let's rewrite it to work with the set of values, which reflects my needs more:
SELECT * FROM dbo.Document WHERE MemberID IN (578310)
Run Code Online (Sandbox Code Playgroud)
This is same fast, ~0s
But now, the set is of IDs needs to be variable; let's define it as:
DECLARE @AuthorizedMembers TABLE
(
MemberID BIGINT NOT NULL …Run Code Online (Sandbox Code Playgroud) 我有一个fields表来存储其他表的列信息:
CREATE TABLE public.fields (
schema_name varchar(100),
table_name varchar(100),
column_text varchar(100),
column_name varchar(100),
column_type varchar(100) default 'varchar(100)',
column_visible boolean
);
Run Code Online (Sandbox Code Playgroud)
我想创建一个函数来获取特定表的数据.刚试过这样的事:
create or replace function public.get_table(schema_name text,
table_name text,
active boolean default true)
returns setof record as $$
declare
entity_name text default schema_name || '.' || table_name;
r record;
begin
for r in EXECUTE 'select * from ' || entity_name loop
return next r;
end loop;
return;
end
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)
使用此功能,我必须在调用它时指定列!
select * from public.get_table('public', 'users') as …Run Code Online (Sandbox Code Playgroud) dynamic-sql ×10
t-sql ×5
postgresql ×4
sql ×4
plpgsql ×3
sql-server ×3
function ×1
mysql ×1
pagination ×1
select ×1
transactions ×1
triggers ×1