标签: dynamic-sql

我可以在SQL Server/TSQL中回滚动态SQL吗?

我可以在事务中运行动态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)

sql t-sql error-handling transactions dynamic-sql

4
推荐指数
1
解决办法
7500
查看次数

如何执行一个非常长的动态sql语句?

我记得在那一天我会做出一大堆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)

t-sql sql-server dynamic-sql

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

用于分页的T-SQL动态Order By in Common Table

我发现了一些用于动态排序和订单的优秀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)

t-sql pagination dynamic-sql common-table-expression

4
推荐指数
1
解决办法
3629
查看次数

计算PostgreSQL中受批处理查询影响的行数

首先,是的,我已经阅读了DO声明的文档:) http://www.postgresql.org/docs/9.1/static/sql-do.html

所以我的问题:

我需要执行一些包含UPDATE语句的动态代码块,并计算所有受影响行的数量.我正在使用Ado.Net提供商.

在Oracle中,解决方案将包含4个步骤:

  1. 将InputOutput参数"N"添加到命令
  2. 添加BEGIN ... END; 命令
  3. add :N:=:每个语句后N + sql%rowcount.
  4. 完成!执行后我们可以从命令中读取N参数.

我怎么能用PostgreSQL做到这一点?我正在使用npgsql提供程序,但如果有帮助可以迁移到devard.

postgresql dynamic-sql plpgsql

4
推荐指数
1
解决办法
5693
查看次数

从Trigger调用包含动态SQL的存储过程

我从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 triggers stored-procedures dynamic-sql

4
推荐指数
1
解决办法
5318
查看次数

SQL Server:如何编写和执行预准备语句?

在MySQL中,我们可以使用生成预准备语句PreparedStatement.

我想在SQL脚本中实现相同的功能.如何创建预准备语句以及如何执行它?请举例说明.

sql t-sql sql-server dynamic-sql prepared-statement

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

如何从作为表名的变量中选择n Postgre> = 9.2

我有一个变量,它是一个表的名称.如何在查询中使用变量选择或更新此变量,例如:

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"不存在

postgresql select dynamic-sql plpgsql

4
推荐指数
1
解决办法
7482
查看次数

如何从Postgres中的动态SQL获取结果?

原始表的规则存储在一个名为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)

sql postgresql dynamic-sql

4
推荐指数
1
解决办法
5542
查看次数

Poor performance of SQL query with Table Variable or User Defined Type

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)

sql t-sql sql-server dynamic-sql table-variable

4
推荐指数
1
解决办法
814
查看次数

用于返回给定表的动态列集的函数

我有一个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)

postgresql function dynamic-sql plpgsql

4
推荐指数
1
解决办法
5700
查看次数