标签: dynamic-sql

跨不同 SQL 读取器共享 SQL 临时表

我正在尝试对创建时间非常长的结果集执行许多不同的查询。为了获得性能提升,我希望使用一个临时表并且只在这个临时表上做很多查询。

看起来很标准。然而,我正在努力在动态 SQL 中共享这个临时表。据我了解,每个 SqlCommand 对象都在自己的线程中执行,因此临时表在不同的范围内 - 从而使其无法从查询线程访问。

我尝试使用全局临时表,效果很好,但不理想?

如何在动态 SQL 查询之间共享本地临时表?

我的意图:

using (var conn = new SqlClient.SqlConnection("..."))
{
    // Creation involes many table joins in reality
    String creationScript = "SELECT * FROM FooTable INTO #MyTemp";
    SqlCommand createTempTbl = new SqlCommand(creationScript, conn);
    createTempTbl.ExecuteNonQuery();

    String query1 = "SELECT * FROM #MyTemp where id=@id";
    SqlCommand query1Comm = new SqlCommand(query1, conn);
    query1Comm.Parameters.Add("@id", ...);

    String query2 = "SELECT * FROM #MyTemp where name=@name";
    SqlCommand query2Comm = new SqlCommand(query2, conn);
    query2Comm.Parameters.Add("@name", ...); …
Run Code Online (Sandbox Code Playgroud)

.net sql ado.net sql-server-2005 dynamic-sql

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

问题:编写MySQL解析器来拆分JOIN并将它们作为单独的查询运行(动态地对查询进行非规范化)

我试图找出一个脚本来获取MySQL查询并将其转换为单独的查询,即动态地对查询进行非规范化.

作为一个测试我构建了一个简单的文章系统,有4个表:

  • 用品
    • article_id的
    • article_format_id
    • ARTICLE_TITLE
    • article_body
    • ARTICLE_DATE
  • article_categories
    • article_id的
    • CATEGORY_ID
  • 类别
    • CATEGORY_ID
    • category_title
  • 格式
    • 业态编号
    • format_title

一篇文章可以在多个类别中,但只有一种格式.我觉得这是现实生活中的一个很好的例子.

在列出所有文章的类别页面上(同时提取format_title),可以使用以下查询轻松实现:

SELECT articles.*, formats.format_title 
FROM articles 
INNER JOIN formats ON articles.article_format_id = formats.format_id 
INNER JOIN article_categories ON articles.article_id = article_categories.article_id 
WHERE article_categories.category_id = 2 
ORDER BY articles.article_date DESC
Run Code Online (Sandbox Code Playgroud)

但是,我尝试构建的脚本将接收此查询,解析它并单独运行查询.

所以在这个类别的页面示例中,脚本将有效地运行它(动态计算):

// Select article_categories
$sql = "SELECT * FROM article_categories WHERE category_id = 2";
$query = mysql_query($sql);
while ($row_article_categories = mysql_fetch_array($query, MYSQL_ASSOC)) {

    // Select articles
    $sql2 = "SELECT * FROM articles WHERE …
Run Code Online (Sandbox Code Playgroud)

php mysql sql dynamic-sql denormalization

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

如何在SQL查询的FROM区域中使用动态表名?

原始问题: 我正在使用每月生成一个新表的数据库并附YYYY_MM加到新表名.我需要编写一个查询,查看当前月份的表格.抛开日期函数,我发现我无法构建表名!

示例表名称将是DOCUMENTS_2011_10.

我尝试使用这样的基本脚本,但它在语法问题上失败:

SELECT * FROM ('DOCUMENTS_'+'2011_10')
Run Code Online (Sandbox Code Playgroud)

有什么建议?

附加信息: 这些表由我们的企业门户应用程序(Oracle WebCenter Interaction)生成.重新设计此应用程序以更改其处理数据的方式是我无法控制的.

我被要求提取一份报告,显示每月生成的这些表中的关键数据.

我的方法是创建一个SQL Reporting Service订阅,每月以Excel格式通过电子邮件发送数据.
我需要有关此查询的帮助才能将其插入到报告服务中,因此我不必每个月都要使用查询来更改表名.

由于报告服务将每月触发并生成报告,因此不需要数据存档或任何类型的临时功能.

使用动态SQL我能够设置表名,不幸的是,当我尝试添加其余的查询时,它会抱怨字符限制问题.知道怎么解决这个问题吗?

这让我得到了正确的表:

Declare @tblName Varchar(400)
Declare @SQL Varchar(500)

Set @tblName = 
'analyticsdbuser.ASFACT_DOCUMENTVIEWS_'
+ CONVERT(VARCHAR,DATEPART(yyyy,GETDATE())) 
+ '_'
+ CONVERT(VARCHAR, RIGHT('0' + RTRIM(MONTH(GETDATE())-1), 2));

SET @SQL = 'SELECT * FROM ' + @Tblname;
Exec(@SQL)
Run Code Online (Sandbox Code Playgroud)

这是所有需要执行但不适合@SQL的其他查询:

SELECT   t2.ID,
         t2.USERID,
         t3.NAME,
         t2.DOCUMENTID,
         t1.NAME AS DOC_NAME,
         t4.PROPERTYID,
         t5.NAME AS PROP_NAME,
         t4.VALUE

FROM     ASFACT_DOCUMENTVIEWS_2011_10 AS t2 INNER JOIN
         ASDIM_USERS AS t3 ON t3.USERID …
Run Code Online (Sandbox Code Playgroud)

sql partitioning sql-server-2005 dynamic-sql sql-server-2008

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

在FROM语句中使用变量

我正在尝试创建一个查询,该查询将针对每个服务器中的特定数据库中的特定表执行一次sys.server.

对于每个server.database.dbo.table我想知道的内容.

所以我需要的是:

declare @numrows int = (select count(*) from sys.servers)
declare @i int = 1

while @i <= @numrows
BEGIN
declare @servername varchar(max) = (select servernaam from #servers where rij = @i)

select * from @servername.DATABASE.DBO.TABLE

set @i = @i+1

END
Run Code Online (Sandbox Code Playgroud)

但是,@servernamein @servername.DATABASE.DBO.TABLE似乎不起作用.

建议?谢谢你和我一起思考.

sql t-sql sql-server dynamic-sql sql-server-2008

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

动态SQL和存储过程优化

我已经读过在存储过程中使用动态SQL会损害存储过程的性能.我猜理论是存储过程不会存储通过EXEC或sp_executesql执行的SQL的执行计划.

我想知道这是否属实.如果确实如此,我是否会遇到多个嵌套IF块的问题,每个块都有一个不同的SQL语句"版本"?

sql-server stored-procedures dynamic-sql sql-server-2008

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

在存储过程中使用动态sql中的临时表

我正在 SQL Server 2012 中编写存储过程。我有一个像这样定义的临时表:

  DECLARE @CURRENT_RET_WEEK_PTIMEIDS TABLE ( PTIMEID INT )
Run Code Online (Sandbox Code Playgroud)

我还EXECUTE用来编写动态 SQL 查询。有什么办法可以将此表加入上述临时表吗?

sql-server stored-procedures dynamic-sql sql-server-2012

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

从表中选择列名称和值

如果我在PostgreSQL数据库中有以下表:

Col1    Col2    Col3    

A       a       1       
B       b       2       
Run Code Online (Sandbox Code Playgroud)

有没有办法在不明确指定列名的情况下获取每个值的列名?即结果集如下:

Col1    A
Col1    B
Col2    a
Col2    b
Col3    1
Col3    2
Run Code Online (Sandbox Code Playgroud)

sql postgresql dynamic-sql hstore

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

如何在触发函数中将OLD,NEW和标识符传递给EXECUTE?

我正在开始尝试新数据库中的一些东西,并遇到了问题.我是PostgreSQL的新手.

我正在尝试在users表的列中创建值的更改历史记录.这个想法很简单.每当有更新时,都会在另一个表(代表历史记录)中插入新记录.

DROP FUNCTION IF EXISTS LOCA_APP.FUNC_HISTORICO_MOD_USUARIOS() CASCADE;
CREATE OR REPLACE FUNCTION LOCA_APP.FUNC_HISTORICO_MOD_USUARIOS() RETURNS TRIGGER
AS $$ 
BEGIN
    EXECUTE 'INSERT INTO LOCA_APP.TB_MODIFICACOES (
        MOD_MOMENTO ,             -- Translated to: Moment
        MOD_VALOR_ANTERIOR ,      -- Translated to: Old value
        MOD_VALOR_ATUAL ,         -- Translated to: New value
        MOD_USUARIO ,             -- Translated to: User (ID)
        MOD_DADO)                 -- Translated to: Data (Column Name - ID)
    VALUES(
        now() , 
        OLD.' || TG_ARGV[0] || ' , 
        NEW.' || TG_ARGV[0] || ' , 
        '|| TG_RELID || ' ,
        (SELECT …
Run Code Online (Sandbox Code Playgroud)

database postgresql triggers dynamic-sql plpgsql

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

在整个数据库中将空字符串 ('') 设置为 NULL

在我的数据库中有许多文本列,其中值是空字符串 ( '')。空字符串需要设置为NULL. 我不知道这个数据库中的确切模式、表和列,或者我想编写一个可以重用的通用解决方案。

我将如何编写查询/函数来查找所有模式中所有表中的所有文本列,并将所有带有空字符串 ( '') 的列更新为NULL

sql postgresql dynamic-sql information-schema plpgsql

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

如何使用动态列进行逆透视 Oracle

我需要解开一个我无法控制列的表,所以我需要动态获取列名:这就是我所拥有的

CREATE TABLE test
(
 PK VARCHAR2(255 CHAR),
COL1                VARCHAR2(255 CHAR),
COL2              VARCHAR2(255 CHAR),
COL3            VARCHAR2(255 CHAR),
COL4              VARCHAR2(255 CHAR),
COL5             VARCHAR2(255 CHAR),
COL6            NUMBER,

)

    declare
      sql_stmt     clob;
      pivot_clause clob;
    begin
      select listagg('''' || column_name || ''' as "' || column_name || '"', ',') within group (order by column_name) 
      into   pivot_clause
    FROM USER_TAB_COLUMNS
    WHERE table_name = 'test');



      sql_stmt := 'SELECT PK,

    VarName,
    Valuer,
    Max(timestamp) over (Partition by PK) as timestamp,

    FROM   test
    UNPIVOT(Valuer FOR VarName IN (' || pivot_clause …
Run Code Online (Sandbox Code Playgroud)

oracle unpivot dynamic-sql

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