以下SQL是否也会删除索引 - 或者它是否必须单独删除?
CREATE TABLE #Tbl (field int)
CREATE NONCLUSTERED INDEX idx ON #Tbl (field)
DROP TABLE #Tbl
Run Code Online (Sandbox Code Playgroud) SQL服务器是否在给定长度不活动后自动清除它们,还是需要担心自动清除它们?如果是这样,我如何查询要清除的表列表?
我试图在表值函数中使用临时表,但似乎我不能.有没有其他方法可以在表值函数中使用临时表?
当前代码:
CREATE FUNCTION dbo.fnt_AllChildren (#ParentName VARCHAR(255))
RETURNS @return_variable TABLE
(
Id INT,
Name VARCHAR(255),
ParentId INT,
ParentName VARCHAR(255)
)
AS
BEGIN
CREATE TABLE #Child (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255))
CREATE TABLE #Parent (Id INT, Name VARCHAR(255), ParentId INT, ParentName VARCHAR(255))
INSERT #Child (Id, Name, ParentId, ParentName)
SELECT child.Id, child.Name, child.ParentId, parent.Name
FROM dbo.t_mytable child
INNER JOIN dbo.t_mytable parent ON child.ParentId = parent.Id
WHERE parent.Name = #ParentName
WHILE (@@ROWCOUNT > 0)
BEGIN
INSERT INTO @return_variable
SELECT * …Run Code Online (Sandbox Code Playgroud) 这似乎相对简单,但显然不是.
我需要通过select into语法创建一个基于现有表的临时表:
SELECT * INTO #TEMPTABLE FROM EXISTING_TABLE
Run Code Online (Sandbox Code Playgroud)
问题是,通过参数接受现有的表名...
我可以通过以下方式获取表的数据:
execute ('SELECT * FROM ' + @tableName)
Run Code Online (Sandbox Code Playgroud)
但是如何将这两者结合起来以便我可以将执行结果直接放入临时表中.
将要用于的每个表的列都不相同,因此在获取数据之前构建临时表是不切实际的.
除了使用全局临时表之外,我对任何建议持开放态度.
更新:
这是完全荒谬的,但我对全球临时表的保留意见是,这是一个多用户平台,如果桌子会长时间停留,就会出现问题......
Sooo ..只是为了通过这个部分,我已经开始使用execute生成一个全局临时表.
execute('select * into ##globalDynamicFormTable from ' + @tsFormTable)
Run Code Online (Sandbox Code Playgroud)
然后我使用全局临时表来加载本地临时表:
select * into #tempTable from ##globalDynamicFormTable
Run Code Online (Sandbox Code Playgroud)
然后我删除全局表.
drop table ##globalDynamicFormTable
Run Code Online (Sandbox Code Playgroud)
这很脏,我不喜欢它,但暂时,直到我得到一个更好的解决方案,它必须工作.
到底:
我想没有办法解决它.
最好的答案似乎是;
在execute命令中创建一个视图,并使用它来加载存储过程中的本地临时表.
在execute命令中创建一个全局临时表,并使用它来加载本地临时表.
有了这个说我可能只是坚持使用全局临时表,因为在我的组织中审计创建和删除视图,我相信如果它一直开始发生,他们会质疑.
谢谢!
使用CTE's(common table expressions)而不是使用是否有好处temp tables.
我在两者之间进行了性能测试,但我发现它们之间没有太大区别.
使用的优点和缺点是CTE'S什么?
sql t-sql temp-tables common-table-expression sql-server-2008-r2
看起来像使用动态SQL通过EXECUTE字符串方法创建的#temptables具有不同的范围,并且不能被同一存储过程中的"固定"SQL引用.但是,我可以在子序列动态SQL中引用由动态SQL语句创建的临时表,但似乎存储过程不会将查询结果返回给调用客户端,除非修复了SQL.
一个简单的2表场景:我有2个表.我们称之为订单和物品.Order具有OrderId的主键,而Items具有ItemId的主键.Items.OrderId是标识父订单的外键.订单可以包含1到n个项目.
我希望能够为用户提供一个非常灵活的"查询构建器"类型界面,以允许用户选择他想要查看的项目.过滤条件可以基于Items表和/或父Order表中的字段.如果一个项满足过滤条件包括和父条件中的条件(如果存在),那么该项应该在查询中返回以及父订单.
通常,我想,大多数人会在Item表和父Order表之间构造一个连接.我想改为执行2个单独的查询.一个返回所有符合条件的项目,另一个返回所有不同的父订单.原因有两个,你可能会也可能不会同意.
第一个原因是我需要查询父Order表中的所有列,如果我执行单个查询将Orders表连接到Items表,我将多次重新发布Order信息.由于每个订单通常有大量商品,我想避免这种情况,因为这会导致更多的数据被转移到胖客户端.相反,如上所述,我想在数据集中单独返回两个表,并使用其中的两个表来填充自定义Order和子Items客户端对象.(我对LINQ或Entity Framework还不够了解.我手工构建了我的对象).
我希望做的是这样的:
在客户端上构造一个动态SQL字符串,它将orders表连接到Items表,并根据在Winform胖客户端应用程序上创建的自定义过滤器指定的每个表上的过滤器.客户端上的SQL构建看起来像这样:
TempSQL = "
INSERT INTO #ItemsToQuery
OrderId, ItemsId
FROM
Orders, Items
WHERE
Orders.OrderID = Items.OrderId AND
/* Some unpredictable Order filters go here */
AND
/* Some unpredictable Items filters go here */
"
Run Code Online (Sandbox Code Playgroud)
然后,我会调用一个存储过程,
CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
Execute (@tempSQL) --to create the #ItemsToQuery table
SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)
SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)
Run Code Online (Sandbox Code Playgroud)
这种方法的问题在于,#ItemsToQuery表由于它是由动态SQL创建的,因此无法从以下2个静态SQL中访问,如果我将静态SQL更改为动态,则不会将结果传递回胖客户端.
我想到了一个更好的一个: …
临时表存储在数据库中的哪个位置?如果临时表已经存在,我想删除它.我可以通过查询信息模式来为安全表执行此操作,但我不知道临时表的存储位置.
显然,我不能使用它们.我收到一条错误消息:
在函数中无效使用副作用运算符'SELECT'
如果我想做这样的事情:
select bleh
into #temp
from Blah
Run Code Online (Sandbox Code Playgroud)
......在一个函数内部.
我创建了一个程序
create procedure testProcedure_One
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into #temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM #temptest
drop table #temptest
end
Run Code Online (Sandbox Code Playgroud)
当我运行该过程时,testProcedure_One我收到错误消息:
Run Code Online (Sandbox Code Playgroud)Invalid object name '#temp'
但是,如果我使用##temp means它的工作:
create procedure testProcedure_two
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into ##temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM ##temptest
drop table ##temptest
end
Run Code Online (Sandbox Code Playgroud)
testProcedure_two 工作正常
可能是什么问题?我怎么解决呢?
我有一个临时表,想要检查一个where子句,在临时表中包含某个id/string.
Select...
WHERE MyId IN MyTempTable
Run Code Online (Sandbox Code Playgroud)
我在MS SQL Management Studio中遇到一般错误.
是"In"运算符不适合临时表?
temp-tables ×10
sql-server ×6
t-sql ×6
sql ×4
function ×2
dynamic-sql ×1
in-operator ×1
indexing ×1
where ×1