我可以安全地假设我使用tempdb写入临时表的存储过程,我最好将它们切换到表变量以获得更好的性能吗?
如果我在MS SQL 2008 R2中运行以下内容,我会得到意外的结果.
create table #DataTable (someID varchar(5))
insert into #DataTable
values ('ID1'),('ID2'),('ID3'),('ID4'),('ID5')
declare @data varchar(8);
declare myCursor cursor for
select someID from #DataTable
open myCursor
FETCH NEXT FROM myCursor INTO
@data
WHILE(@@Fetch_Status >=0)
BEGIN
declare @tempTable table (someValue varchar(10))
insert into @tempTable select @data + '_ASDF'
select * from @tempTable
FETCH NEXT FROM myCursor INTO
@data
END
close myCursor
deallocate myCursor
drop table #DataTable
Run Code Online (Sandbox Code Playgroud)
最后一次迭代的结果:
someValue
ID1_ASDF
ID2_ASDF
ID3_ASDF
ID4_ASDF
ID5_ASDF
Run Code Online (Sandbox Code Playgroud)
我原以为只会看到
someValue
ID5_ASDF
Run Code Online (Sandbox Code Playgroud)
似乎表变量@tempTable保持在游标迭代之间的范围内 - 但是如何在每次迭代中重新声明变量?对我毫无意义.
我解决了 …
我可以声明一个表变量:
DECLARE @tv_source TABLE(c1 int,
providerName varchar(50),
providerSMS varchar(50))
Run Code Online (Sandbox Code Playgroud)
如果我然后执行以下操作,我看到的表名类似于:"#468862B0"
select top 1 * from tempdb.sys.tables where type = 'U' order by create_date desc
select TOP 1 name,* from tempdb.sys.sysobjects ORDER BY CRDATE desc
Run Code Online (Sandbox Code Playgroud)
如果我然后立即执行:
select TOP 3 *
from tempdb.sys.columns
where object_id in (select TOP 1 object_id from tempdb.sys.tables ORDER BY Create_date desc)
Run Code Online (Sandbox Code Playgroud)
我看到上面为表变量声明的列.
我的问题是,有没有办法明确地将这些列与我在"@tv_source"上面的表声明中声明的名称相关联?
在普通表中,您将看到实际名称,但如上所述,表变量变为十六进制值(其中,btw是object_id的十六进制值).
任何人都可以告诉我在哪里使用CTE,temp table和table variable?
我读到他们的差异,但我对他们的用法感到困惑.请帮忙.
谢谢.
temp-tables common-table-expression table-variable sql-server-2014
首先,来自BOL:
修改表变量的查询不会生成并行查询执行计划.当修改非常大的表变量或复杂查询中的表变量时,性能会受到影响.在这些情况下,请考虑使用临时表.有关更多信息,请参见CREATE TABLE(Transact-SQL).读取表变量而不修改它们的查询仍然可以并行化.
这看起来很清楚.读取表变量而不修改它们的查询仍然可以并行化.
但是在Sun Server Agarwal在2008年3月30日的一篇关于tempdb的文章中说,这是一个声誉卓着的SQL Server存储引擎:
涉及表变量的查询不会生成并行计划.
Sunil是否解释了BOL:INSERT,或者FROM子句中是否存在表变量会阻止并行性?如果是这样,为什么?
我正在考虑控制表用例,其中有一个小控件表连接到一个更大的表,映射值,充当过滤器,或两者兼而有之.
谢谢!
sql sql-server parallel-processing table-variable sql-server-2008
当我定义“用户定义的表类型”时,为:
CREATE TYPE [dbo].[BitType] AS TABLE(
[B] [bit] NULL
)
Run Code Online (Sandbox Code Playgroud)
我将0和null放在此表变量中。然后我执行以下查询:
SELECT something FROM theTable WHERE item IN @theBitTypeTable
Run Code Online (Sandbox Code Playgroud)
只会得到item=0不item is null
简而言之:SELECT something FROM theTable WHERE item IN (0, NULL)不起作用(尽管没有错误)SELECT something FROM theTable WHERE item=0 OR item IS NULL
所以,我的问题是,如果我想使用User-Defined Table Type,但我还需要使用NULL值。如何正确执行查询以获取包含空项目的结果。
谢谢(顺便说一句,我使用MS SQL Server 2008 R2)
在Sql Server 2012中调试的监视窗口中,我们可以看到常规变量的值,我们可以在特殊窗口中查看xml,与sql字符串相同,但对于表变量,它只是说(表).
我真的很想知道在那一刻是否有任何方法可以查看该表变量并检查内容.
编辑:
我发现Visual Studio(很长一段时间以来)已经有了一个"Table"可视化器以及Xml,Html和Text.这对我没有帮助,但它强调了我最初的观点,即它是一个非常可行的功能.我对Sql Server SSMS团队与Visual Studio团队的一般感到非常失望.我认为Redmond的Visual Studio开发人员每5年应该被迫在SSMS团队进行2或3次冲刺的"值班之旅".如果他们这样做,他们可以帮助它太多.
谢谢.
sql-server debugging table-variable watch-window sql-server-2012
我有一个CTE查询这个
;With CTE_Table as (SELECT ...)
Select * from CTE_Table
Run Code Online (Sandbox Code Playgroud)
现在我尝试将此结果保存到table variable或temporary table.如果我试试
Declare @Table table
(...)
INSERT INTO @Table (...)
HER I PUT THE CODE ABOVE
Run Code Online (Sandbox Code Playgroud)
我得到一个incorrect syntax error周围的WITH声明.我猜这个Insert Into命令期望Select statement代替a 而不是;WITH同样的代价Create Table.我一直在寻找解决方案,但我找到的所有解决方案都没有涉及Select Statement到;With.如何将上面显示的输出变为temporary table或table variable?
我使用SQL Server 2014.
sql t-sql common-table-expression table-variable sql-server-2014
我正在使用我在Microsoft SQL Server 2012上应用的RODBC包.
现在我发现了一个困扰我的现象.
如果我使用RODBC命令sqlQuery运行以下查询,那么在R中,我将返回一个包含Country,CID,PriceID和WindID列的空数据框.
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
)
SELECT * FROM @tbl_Ids
Run Code Online (Sandbox Code Playgroud)
到目前为止,一切都很好.
但是,如果我尝试将记录写入表变量并执行
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
)
INSERT INTO @tbl_IDs
VALUES
('Germany', 'DE', 112000001, 256000002);
SELECT * FROM @tbl_Ids
Run Code Online (Sandbox Code Playgroud)
然后,在R中,结果将是一个空字符而不是具有一个记录的数据帧.仍然相同的查询与SQL Server Management Studio完美配合.此外,我们在执行R-Query时跟踪了数据库服务器的行为,服务器似乎完美地处理了它.看起来RODBC接口有问题将结果返回到R控制台.
有没有人知道如何解决这个问题?
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) table-variable ×10
sql ×6
sql-server ×5
t-sql ×4
temp-tables ×3
cursor ×1
debugging ×1
dynamic-sql ×1
r ×1
rodbc ×1
scope ×1
watch-window ×1