我正在学习表变量的更多细节.它表示临时表总是在磁盘上,表变量在内存中,也就是说,表变量的性能优于临时表,因为表变量比临时表使用更少的IO操作.
但有时,如果表变量中的记录太多而无法包含在内存中,则表变量将像临时表一样放在磁盘上.
但我不知道"太多记录"是什么.100,000条记录?或1000,000条记录?我怎么知道我正在使用的表变量是在内存中还是在磁盘上?SQL Server 2005中是否有任何函数或工具来测量表变量的大小或让我知道何时将表变量从内存放入磁盘?
你能index在一个表变量上创建SQL Server 2000吗?
即
DECLARE @TEMPTABLE TABLE (
[ID] [int] NOT NULL PRIMARY KEY
,[Name] [nvarchar] (255) COLLATE DATABASE_DEFAULT NULL
)
Run Code Online (Sandbox Code Playgroud)
我可以在Name上创建索引吗?
我正在将SQL从Teradata转换为SQL Server
在Teradata,他们有格式
SELECT col1, col2
FROM table1
INTO @variable1, @variable2
Run Code Online (Sandbox Code Playgroud)
在SQL Server中,我找到了
SET @variable1 = (
SELECT col1
FROM table1
);
Run Code Online (Sandbox Code Playgroud)
这只允许每个语句使用一个列/变量.如何使用单个SELECT语句分配2个或更多变量?
我有桌子 Tb
ID | Name | Desc
-------------------------
1 | Sample | sample desc
Run Code Online (Sandbox Code Playgroud)
我想在INSERT上创建一个触发器,它将改变插入的值Desc,例如:
INSERT INTO Tb(Name, Desc) VALUES ('x', 'y')
Run Code Online (Sandbox Code Playgroud)
会导致
ID | Name | Desc
-------------------------
1 | Sample | sample desc
2 | x | Y edited
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我得到了插入的值,将其Desc更改为大写并添加edited到最后.
这就是我需要的,得到Desc插入和修改它.
我怎样才能做到这一点?
插入更新后处理它会更好吗?或者使用INSTEAD OF INSERT触发并在每次表结构更改时修改它?
我们有如下所示的预约表。每个约会都需要归类为“新”或“后续”。在(该患者的)首次预约后 30 天内的任何预约(对患者)都是随访。30 天后,约会再次“新”。30 天内的任何约会都将成为“后续”。
我目前正在通过输入 while 循环来做到这一点。
如何在没有 WHILE 循环的情况下实现这一目标?
桌子
CREATE TABLE #Appt1 (ApptID INT, PatientID INT, ApptDate DATE)
INSERT INTO #Appt1
SELECT 1,101,'2020-01-05' UNION
SELECT 2,505,'2020-01-06' UNION
SELECT 3,505,'2020-01-10' UNION
SELECT 4,505,'2020-01-20' UNION
SELECT 5,101,'2020-01-25' UNION
SELECT 6,101,'2020-02-12' UNION
SELECT 7,101,'2020-02-20' UNION
SELECT 8,101,'2020-03-30' UNION
SELECT 9,303,'2020-01-28' UNION
SELECT 10,303,'2020-02-02'
Run Code Online (Sandbox Code Playgroud) 我们一直在使用用户定义的表类型将整数列表传递给我们的存储过程.
然后我们使用它们连接到存储过程查询中的其他表.
例如:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
SELECT
*
FROM
SOMETABLE
INNER JOIN @Ids [OurTableType] ON [OurTableType].Id = SOMETABLE.Id
Run Code Online (Sandbox Code Playgroud)
在使用更大的数据集时,我们发现这方面的表现很差.
我们用来加快速度的一种方法是将内容转储到临时表中,然后将其加入.
例如:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
CREATE TABLE #TempTable(Id INT)
INSERT INTO #TempTable
SELECT Id from @Ids
SELECT
*
FROM
SOMETABLE
INNER JOIN #TempTable ON #TempTable.Id = SOMETABLE.Id
DROP TABLE #TempTable
Run Code Online (Sandbox Code Playgroud)
这确实显着提高了性能,但我希望对这种方法以及我们未考虑的任何其他后果有所了解.关于为什么这改善性能的解释也可能是有用的.
NB有时我们可能需要传递的不仅仅是一个整数,因此我们不使用逗号分隔列表或类似的东西.
t-sql sql-server user-defined-types table-valued-parameters sql-server-2008-r2
表变量是在内存中还是在tempdb中创建的?短临时表也一样吗?
我正在尝试将CSV插入到临时表中,并且此SQL语句似乎不起作用.
DECLARE @TempTable TABLE (FName nvarchar(max),SName nvarchar(max),
Email nvarchar(max));
BULK INSERT @TempTable
FROM 'C:\52BB30AD694A62A03E.csv'
WITH (FIELDTERMINATOR = ',',ROWTERMINATOR = '\n')
Run Code Online (Sandbox Code Playgroud)
得到以下错误....
Incorrect syntax near '@TempTable'.
我在使用LINQ to SQL的存储过程中使用临时表.我将存储过程添加到Linq到SQL dbml文件然后项目发生错误消息
"未知的返回类型 - 无法检测到以下存储过程的返回类型."
当我删除存储过程中的临时表时,返回值很好.
如何在Linq to SQL的存储过程中使用临时表
我替换了这样的临时表
CREATE TABLE tempTable(
PartsReceivingID INT,
SoPartID INT,
RecvQty INT,
ReturnQty INT
)
Run Code Online (Sandbox Code Playgroud)
替换如下
SELECT @RowCount = count(*)
FROM Parts.studentTempTable
IF @RowCount > 0
BEGIN
TRUNCATE TABLE Parts.studentTempTable;
END
Run Code Online (Sandbox Code Playgroud)
工作版存储过程
ALTER PROCEDURE [dbo].[stp_student_Select_New]
@pSchID as int,
@pCompanyID as int,
@pAgingDate as int,
@pTicketNo as VARCHAR(50),
@pInvoiceNo as VARCHAR(50),
@pDeliveryNo as VARCHAR(50),
@pPartNo as VARCHAR(50)
As
SET NOCOUNT ON
BEGIN
SELECT @RowCount = count(*)
FROM Parts.studentTempTable
IF @RowCount > 0 …Run Code Online (Sandbox Code Playgroud) 所有都用于临时存储数据.
这3种临时表是否存在性能差异(时间复杂度和空间复杂度)?
性能问题应取决于结果是保存在磁盘还是内存中.
我搜索了很多,但没有得到满意的答案.
sql sql-server performance temp-tables common-table-expression
是否可以在tsql中声明一个变量而不显式定义列?
就像是
declare @tab as select * from myTable
Run Code Online (Sandbox Code Playgroud) 我可以安全地假设我使用tempdb写入临时表的存储过程,我最好将它们切换到表变量以获得更好的性能吗?
我想从每个删除语句的相同条件(where子句)的多个表中删除数据.
delete from tblA where id in (select x.id from tblX x where name like N'%test%')
delete from tblB where id in (select x.id from tblX x where name like N'%test%')
delete from tblC where id in (select x.id from tblX x where name like N'%test%')
delete from tblD where id in (select x.id from tblX x where name like N'%test%')
Run Code Online (Sandbox Code Playgroud)
有没有办法声明一个列表来存储上面的select语句中的id?
我试过了:
declare @ids int
set @ids = select x.id from tblX x where name like N'%test%'
Run Code Online (Sandbox Code Playgroud)
但它抱怨说
子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> …
sql-server ×9
sql ×8
t-sql ×6
temp-tables ×3
indexing ×1
linq-to-sql ×1
performance ×1
teradata ×1
triggers ×1
vb.net-2010 ×1