表变量是在内存中还是在tempdb中创建的?短临时表也一样吗?
我下面有一个小的存储过程.
我将表名作为存储过程的输入参数,以便我计划将数据插入临时表并显示相同的内容.这只是我项目存储过程的一个很小的代码块.
当我编译下面的内容时,它会将select语句中的参数视为表变量并将错误抛出为:
必须声明表变量"@TableName".
SQL:
CREATE PROCEDURE xyz @TableName Varchar(50)
AS
BEGIN
SELECT TOP 10 * INTO #Temp_Table_One
FROM @TableName
SELECT * FROM #Temp_Table_One
END
Run Code Online (Sandbox Code Playgroud) 我们在存储过程中使用表变量时遇到性能问题.
这是实际发生的事情:
DECLARE @tblTemp TABLE(iId_company INT)
INSERT INTO @tblTemp(iId_company)
SELECT id FROM .....
Run Code Online (Sandbox Code Playgroud)
SELECT返回138个结果,但插入TABLE变量需要1分15但是当我使用具有相同SELECT的临时表时,woops需要0sec:
CREATE TABLE #temp (iId_company INT)
INSERT INTO #temp(iId_company)
SELECT id FROM ...
Run Code Online (Sandbox Code Playgroud)
什么可能导致这种行为?
为什么临时表比SQL Server中的连接的表变量更快?
注意:在两种情况下,表都有PK,表通过PK与其他"物理"表连接.
我有以下表变量声明:
DECLARE @MyTable TABLE
(
--ten columns declared here
)
Run Code Online (Sandbox Code Playgroud)
并且我想声明另一个具有相同结构的表变量(以便我将select-from-select插入到第一个,然后将结果复制到第二个,然后我逐个从第一个变量中删除条目并返回第二个结果是).
我试过这个:
DECLARE @MyTable, @MyTableCopy TABLE
(
--ten columns declared here
)
Run Code Online (Sandbox Code Playgroud)
但SQL Server Express并不满意
消息102,级别15,状态1,行1','附近的语法不正确.
如何声明两个结构相同的表变量?
我真正想要做的是我想向 SQL Server 发送一个字符串数组。我正在使用 SQL Server 2008。
这可以标记为重复,但在从 stactoverflow 实施解决方案时,我面临着另一个问题
这是我的 C# 和存储过程代码
C#代码:
string[] str = new string[] {"s" , "a" , "k"};
DataTable dt = new DataTable();
dt.Columns.Add("names");
foreach (string item in str)
{
dt.Rows.Add(item);
}
foreach (DataRow r in dt.Rows)
{
Console.WriteLine(r["names"].ToString());
}
DataTable tvp = new DataTable();
SqlConnection conn = new SqlConnection("Data Source=SHZAK;Initial Catalog=synchroniztionTesing;Integrated Security=True");
conn.Open();
using (conn)
{
SqlCommand cmd = new SqlCommand("strpdPassAnStringArray", conn);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter …Run Code Online (Sandbox Code Playgroud) 我目前正在使用SQL Server 2008,我正在尝试使用表变量创建一个语句,以在表中插入多行.就目前而言,我必须在4个不同的位置插入信息(2个选择语句,1个插入和1个更新),但是希望能够创建单个表变量,所以我只需要输入信息一次.任何帮助/建议将不胜感激.
这是我想要改变的一个例子.
PRINT 'Before'
SELECT GROUPID, ModifiedBy, ModifiedDate
FROM TableXYZ
WHERE groupID in(ID1, ID2, ID3, ID4)
BEGIN TRAN
Insert into TableXYZ
(GROUPID)
VALUES
(ID1), (ID2), (ID3), (ID4)
UPDATE TableXYZ
SET existingdays = 15
,ModifiedBy = @userID
,ModifiedDate = @today
WHERE groupID in(ID1, ID2, ID3, ID4)
Set @RowCount = @@ROWCOUNT
PRINT 'After '
SELECT GROUPID, ModifiedBy, ModifiedDate
FROM TableXYZ
WHERE groupID in(ID1, ID2, ID3, ID4)
Run Code Online (Sandbox Code Playgroud) 我最近一直在使用dapper,总而言之,除了使用表变量之外,它没有任何问题。
为了进行演示,我使用了此线程中的修改示例。
这段代码运行没有问题:
int tally = connection.Execute(
"create table #t(Name nvarchar(max), Age int)\n" +
"insert #t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Run Code Online (Sandbox Code Playgroud)
但这并没有:
int tally = connection.Execute(
"create table @t(Name nvarchar(max), Age int)\n" +
"insert @t (Name,Age) values(@Name, @Age)", new[]
{
new {Age = 1, Name = "sam"},
new {Age = 2, Name = "bob"}
});
Run Code Online (Sandbox Code Playgroud)
唯一的变化是使用表变量而不是临时表 ( @ instead #)。Dapper(或链中的其他任何东西?)似乎以某种方式将其与参数混合并返回“必须声明表变量@t …
我想知道为什么while循环中的表变量不像其他变量那样.表变量只创建一次,将在整个循环中使用.但是每当循环增加时,其他变量都会被初始化.
有关详细信息,请查看以下代码
declare @tt int
set @tt =10
while @tt>0
begin
declare @temptable table(id int identity(1,1),sid bigint)
insert into @temptable
select @tt union all
select @tt + 1
select * from @temptable
--delete from @temptable
set @tt=@tt-1
end
Run Code Online (Sandbox Code Playgroud)
这是一个错误?
我有这个表变量声明后跟一个查询:
DECLARE @CurrentItems TABLE
(
ItemId uniqueidentifier,
ItemUnits int
)
UPDATE U SET U.Units = U.Units + [@CurrentItems].ItemUnits
FROM @CurrentItems CI INNER JOIN U ON U.UId=CI.ItemId;
Run Code Online (Sandbox Code Playgroud)
并U定义如下:
CREATE TABLE [dbo].[U] (
[UId] UNIQUEIDENTIFIER UNIQUE NOT NULL,
[Units] INT DEFAULT ((0)) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
当我在SQL Management Studio中针对SQL Server 2005 Express运行时,我得到以下内容:
Msg 208,Level 16,State 1,Line 24
无效的对象名称'@CurrentItems'.
我已经看过这个和这个非常相似的问题,但无法弄清楚如何解决问题.
什么是实际问题,我该如何解决?
table-variable ×10
sql-server ×8
sql ×4
c# ×2
insert ×2
t-sql ×2
temp-tables ×2
dapper ×1
join ×1
while-loop ×1