有没有办法确定是否在会话中创建了特定的临时表而没有引用它创建的tempdb数据库?用户在登录时会分配给特定的tempdb,因此我不知道他们将使用哪个tempdb.
我不需要指定tempdb来从临时表中选择数据,所以我肯定可以看到表是否存在?
我有一个脚本从更大的表中提取某些数据,其中一个字段特别是定期更改,例如
SELECT CASE @Flag WHEN 1 THEN t.field1 WHEN 2 THEN t.field2 WHEN 3
THEN t.field3 END as field,
...[A bunch of other fields]
FROM table t
Run Code Online (Sandbox Code Playgroud)
但是,现在问题是我想对数据进行其他处理.我想找出最有效的方法.我需要有一些方法来获取标志,所以我知道我正在谈论由正确的字段切片的数据.
我正在玩一个可能的解决方案(主要是看看会发生什么)是将脚本的内容转储到一个表函数中,该表函数已经传递给它,然后对函数的结果使用SELECT查询.我设法让它工作,但它明显慢于......
显而易见的解决方案,也许是处理器周期的最有效使用:创建一系列缓存表,一个用于三个标志值中的每一个.然而,问题是找到一些从正确的缓存表中提取数据以执行计算的方法.显而易见但不正确的反应就像是
SELECT CASE @Flag WHEN 1 THEN table1.field WHEN 2 THEN table2.field WHEN 3
THEN table3.field END as field,
...[The various calculated fields]
FROM table1, table2, table3
Run Code Online (Sandbox Code Playgroud)
不幸的是,很明显,这会产生一个巨大的交叉连接 - 这根本不是我想要的结果.
有谁知道如何将这个交叉连接变成"只看x桌"?(不使用动态SQL,这会让事情难以处理?)或者另一种解决方案,那仍然相当快速?
编辑:这是否是一个很好的理由,我试图实现的想法是没有三个基本相同的查询,只有表格不同 - 每当对逻辑进行更改时,必须进行相同的编辑.这就是为什么我到目前为止避免了"让国旗完全分开"的原因......
我想做这样的事情:
while @nrOfAuthlevels >= @myAuthLevel
begin
set @myAuthLevel = @myAuthLevel + 1
SELECT Role.name, Role.authorityLevel
FROM [dbo].[Role]
ORDER BY Role.authorityLevel
end
Run Code Online (Sandbox Code Playgroud)
此存储过程的结果应该是一个包含我自己的所有Role.authorityLevel的表.但这会产生几个表格.
提前致谢
Br Christoffer
快速简介:
我团队中的人员一直在研究生产数据库(sql server 2005).我们添加了各种内容,例如约束,添加的触发器等.
现在我们发现某人或某事已在不同时间回滚我们的变化.问题是我们都共享一个共同的管理员登录.(愚蠢,是的,我知道,我们正在解决这个问题).它造成了大量的挫败感,此时我们只是想找出whodunnit.
你会如何追查有罪的党?
注意:我不是在寻找解决这个问题的方法,这已经在做了.我正在寻找一种方法来追查罪魁祸首.
我的一个朋友问我是否知道为什么他不应该在SQL-Server 2000中的View中包含Temporal或变量表.我只能认为每次访问视图时都会创建一个新表,但我想知道的是还有其他问题.
谢谢,
编辑:这是不可能的
我在这做错了什么?我对INTO子句的使用似乎与我在Microsoft的Transact-SQL参考页面中找到的示例匹配,但我必须遗漏一些东西.
DECLARE @rowtemp table(TestRunID int, RunOrder int)
SELECT TestRunID, ROW_NUMBER() OVER (ORDER BY TestRuns.TestTime ASC)
AS 'RunOrder' INTO @rowtemp FROM TestRuns WHERE RunID = @runID
Run Code Online (Sandbox Code Playgroud) 我正在尝试学习高级sql以及如何使用系统查询(sql server).以下查询有点令人困惑.
CREATE PROC dbo.ShowHierarchy
(
@Root int
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @EmpID int, @EmpName varchar(30)
SET @EmpName = (SELECT EmpName FROM dbo.Emp WHERE EmpID = @Root)
PRINT REPLICATE('-', @@NESTLEVEL * 4) + @EmpName
SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root)
WHILE @EmpID IS NOT NULL
BEGIN
EXEC dbo.ShowHierarchy @EmpID
SET @EmpID = (SELECT MIN(EmpID) FROM dbo.Emp WHERE MgrID = @Root AND EmpID > @EmpID)
END
END
GO
Run Code Online (Sandbox Code Playgroud)
取自这里:
http://vyaskn.tripod.com/hierarchies_in_sql_server_databases.htm
每次运行查询时,@ EmpId参数如何递增?它会自己做吗?另外,每次递归都会增加@root吗?例如CEO是root,直接下属,直接下属现在是@root等.
谢谢
替代文字http://agricam.net/test.gif
我需要在市场营销人数改变之后在SQL中动态添加一行,其中标题为"Marketer Total",只应添加"Total"列.例如,在Marketer 22行的最后一行之后,应该有"Marketer Total",然后在Total列下面应该是1804.同样应该在Marketer 500的最后一行之后发生.
请参见http://agricam.net/test.gif上的图片
当前查询:
从SomeTable中选择Marketer,SubMarketer,Grade,Total,Convert(varchar,Date,101)[Date],其中Date> ='2/25/2009'和Date <'2/26/2009'和Marketer in('22' ,'500')分组由SubMarketer,Grade,Marketer,Date,总订单由Marketer提供
谢谢.
我一直在使用这种方法来过滤我的查询:
Create PROCEDURE [dbo].[pGetTask]
@showCompletedTasks bit = 1
,@showInProgressTasks bit = 1
,@taskID int = null
,@projectID int = null
,@applicationID int = null
,@clientID int = null
... Snip ...
where
a.clientID = isnull(@clientID, a.clientID)
and a.applicationID = isnull(@applicationID, a.applicationID)
and p.projectID = isnull(@projectID, p.projectID)
and t.taskID = isnull(@taskID, t.taskID)
and curr.complete = case @showCompletedTasks when 0 then 0 else curr.complete end
and curr.complete = case @showInProgressTasks when 0 then 1 else curr.complete end
Run Code Online (Sandbox Code Playgroud)
这实际上会使我的查询在664行结果集上减慢2秒.SQL调优顾问没有多大帮助,所以我认为这不是正确的方法.除了大量的if语句之外,还有正确的方法吗?
对于像这样的 OrderLine 表:
| 命令 | 线 | 第 3 列 | 第 4 列 |
|---|---|---|---|
| 1 | 1 | X | X |
| 1 | 2 | X | 是 |
| 2 | 1 | 是 | X |
| 2 | 2 | 是 | X |
| 3 | 1 | X | 是 |
| 3 | 2 | 是 | 是 |
| 4 | 1 | X | 是 |
| 4 | 2 | X | 是 |
Col4 可以是 X 或 Y,但不能同时是两者。该表中的命令 1 违反了规则。如何查找同一订单在 Col4 中具有不同值的所有订单?
我最初的想法是多次加入表,然后使用 HAVING 子句。
SELECT DISTINCT A.[Order], A.Line, A.Col3, A.Col4, A.Col4
FROM OrderLines A
INNER JOIN OrderLines B ON B.[Order]= A.[Order]
AND B.Line = A.Line
GROUP BY A.[Order], A.Line, …Run Code Online (Sandbox Code Playgroud)