我正在尝试对创建时间非常长的结果集执行许多不同的查询。为了获得性能提升,我希望使用一个临时表并且只在这个临时表上做很多查询。
看起来很标准。然而,我正在努力在动态 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) 我试图找出一个脚本来获取MySQL查询并将其转换为单独的查询,即动态地对查询进行非规范化.
作为一个测试我构建了一个简单的文章系统,有4个表:
一篇文章可以在多个类别中,但只有一种格式.我觉得这是现实生活中的一个很好的例子.
在列出所有文章的类别页面上(同时提取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) 原始问题:
我正在使用每月生成一个新表的数据库并附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
我正在尝试创建一个查询,该查询将针对每个服务器中的特定数据库中的特定表执行一次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会损害存储过程的性能.我猜理论是存储过程不会存储通过EXEC或sp_executesql执行的SQL的执行计划.
我想知道这是否属实.如果确实如此,我是否会遇到多个嵌套IF块的问题,每个块都有一个不同的SQL语句"版本"?
我正在 SQL Server 2012 中编写存储过程。我有一个像这样定义的临时表:
DECLARE @CURRENT_RET_WEEK_PTIMEIDS TABLE ( PTIMEID INT )
Run Code Online (Sandbox Code Playgroud)
我还EXECUTE用来编写动态 SQL 查询。有什么办法可以将此表加入上述临时表吗?
如果我在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) 我正在开始尝试新数据库中的一些东西,并遇到了问题.我是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) 在我的数据库中有许多文本列,其中值是空字符串 ( '')。空字符串需要设置为NULL. 我不知道这个数据库中的确切模式、表和列,或者我想编写一个可以重用的通用解决方案。
我将如何编写查询/函数来查找所有模式中所有表中的所有文本列,并将所有带有空字符串 ( '') 的列更新为NULL?
我需要解开一个我无法控制列的表,所以我需要动态获取列名:这就是我所拥有的
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) dynamic-sql ×10
sql ×6
postgresql ×3
sql-server ×3
plpgsql ×2
.net ×1
ado.net ×1
database ×1
hstore ×1
mysql ×1
oracle ×1
partitioning ×1
php ×1
t-sql ×1
triggers ×1
unpivot ×1