Sql server 如何在QlikView脚本中执行多语句SQL?

Sql server 如何在QlikView脚本中执行多语句SQL?,sql-server,qlikview,Sql Server,Qlikview,我有一个MS-SQL查询,使用临时表,我想从中获取数据到QlikView: declare @oi_im table (tick datetime); insert into @oi_im SELECT TOP 360 dateadd(mi, datediff(mi, 0, GETDATE()) - ROW_NUMBER() OVER (ORDER BY ID), 0) as tick FROM [Messages] timer; SELECT tick as Created, case w

我有一个MS-SQL查询,使用临时表,我想从中获取数据到QlikView:

declare @oi_im table (tick datetime);

insert into @oi_im
SELECT TOP 360 dateadd(mi, datediff(mi, 0, GETDATE()) - ROW_NUMBER() OVER (ORDER BY ID), 0) as tick
FROM [Messages] timer;

SELECT tick as Created, case when msgs is NULL then 0 else msgs end as msgs
FROM (SELECT TOP 360 tick
FROM @oi_im) timer
LEFT JOIN (SELECT TOP 360 dateadd(mi, datediff(mi, 0, Created), 0) as Created, count(*) as msgs
  FROM [Messages] with(nolock)
  GROUP BY dateadd(mi, datediff(mi, 0, Created), 0)
  ORDER BY Created desc) msgslist ON msgslist.Created=timer.tick
ORDER BY timer.tick desc
我的第一次尝试是将此文本复制到QlickWiev“编辑脚本”窗口中,但问题是-脚本将语句逐个抛出到SQL中。 在生成第一条语句(生成临时表)后,MS SQL server将丢失上下文,并且在第二条语句中生成错误“我不知道任何@oi_im”

下一步尝试将此文本包装到存储过程中:

SQL execute sp_executesql N'declare @oi_im table (tick datetime);


insert into @oi_im
SELECT TOP 360 dateadd(mi, datediff(mi, 0, GETDATE()) - ROW_NUMBER() OVER (ORDER BY ID), 0) as tick
FROM [Messages] timer with(nolock);


SELECT tick as Created, case when msgs is NULL then 0 else msgs end as msgs
FROM (SELECT TOP 360 tick
FROM @oi_im) timer
LEFT JOIN (SELECT TOP 360 dateadd(mi, datediff(mi, 0, Created), 0) as Created, count(*) as msgs
  FROM [Messages] with(nolock)
  GROUP BY dateadd(mi, datediff(mi, 0, Created), 0)
  ORDER BY Created desc) msgslist ON msgslist.Created=timer.tick
ORDER BY timer.tick desc
'
它不产生任何错误,但不幸的是,根本没有返回任何数据


所以问题是:当第一条SQL语句不是SELECT语句时,如何在QlikView脚本中执行多语句SQL?

我对QlikView一无所知,但您的SQL有几个问题。首先是使用Top360,无需订购。当您这样做时,您无法知道将得到哪些行。其次是诺洛克的暗示。你知道这个暗示的所有问题吗?它的真正作用是什么?嗨,肖恩!第一:我在第二个查询中使用ORDERBY,这是真正需要的。第一个运行良好,没有任何订单。我不知道如何和为什么,但只要它工作-我不修理它。第二:是的,我读过这个提示是如何工作的,它能做什么和不能做什么。。。这是使用它的公司政策:)如果您不关心返回的是哪一行,那么第一行就起作用。它将返回360,但您不知道是哪一个。如果你读了我贴的那篇文章,它解释了为什么你会看到你所看到的。它会在某个时候停止获取正确的行,并会让你发疯。省去你的麻烦,在那里下订单。如果你的公司政策要求你在每次查询中都得到不准确的结果,那么你的公司政策是完全有缺陷的。这一暗示充其量是危险的,最糟糕的是破坏性的。我去过那些强制执行该政策的商店,当我看到它意味着什么时,它可以被改变。谢谢你,肖恩,实际上是有错误的,但是你提到的那个。第一个SELECT具有ORDER BY,因此第二个SELECT(来自临时表)实际上不需要TOP。不管怎么说,只要我不能将数据导入QlikView,所有这些都没有多大意义。是的,我无法帮助QlikView部分。但是,我建议您的第一个查询没有order by,您会看到一个,因为它在ROW_NUMBER窗口函数中,但实际查询只会得到前360行,并且没有逻辑顺序。如果这不重要,那没什么大不了的。:)