什么是表变量?以及如何使用与现有存储过程结果集匹配的列创建表变量(虚拟内存表).
我执行了这个程序,在执行之后,我知道列名.但是,我是否必须声明与存储过程中相同的列数据类型?
编辑:我试过这个
DECLARE @Table TABLE(
name varchar(30) NOT NULL,
location varchar(30) NOT NULL
);
INSERT @Table
SELECT name, location FROM
Exec SPROC @param , @param
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚为什么(或者你可能不能这样做)我得到了超出范围的错误
必须声明标量变量"@CompanyGroupSites_Master.
那么我无法在我的Cursor中以这种方式访问我的Table变量,或者我一定错过了一些简单的东西,当从光标体内引用时保持该表变量超出范围?
DECLARE @TotalCompaniesToProcess int
SET @TotalCompaniesToProcess = (select distinct Count(BusinessLine) from vwBuisinessUnit)
IF(@TotalCompaniesToProcess > 0)
BEGIN
---------------- ############# SETUP ############# ----------------
DECLARE @Companies TABLE (Company varchar(30))
Insert Into @Companies select distinct Company from Companies
DECLARE @CompanyGroups_Added TABLE(
CompanyGroupDesc varchar(50),
size varchar(50)
)
DECLARE @CompanyGroupSites_Added TABLE (
CompanyGroupID int,
CompanyID varchar(12)
)
DECLARE @CompanyGroupSites_Master TABLE (
CompanyGroupID int,
CompanyID varchar(12)
)
Insert into @CompanyGroupSites_Master select CompanyGroupID, CompanyID from Sec.CompanyGroupSites
DECLARE @CompanyGroupID int
DECLARE @Company int
---------------- END SETUP ---------------- …Run Code Online (Sandbox Code Playgroud) 在T-SQL中有什么类似表变量的吗?
在Sql Server中,它看起来像这样:
DECLARE @ProductTotals TABLE
(
ProductID int,
Revenue money
)
Run Code Online (Sandbox Code Playgroud)
然后在程序中我可以:
INSERT INTO @ProductTotals (ProductID, Revenue)
SELECT ProductID, SUM(UnitPrice * Quantity)
FROM [Order Details]
GROUP BY ProductID
Run Code Online (Sandbox Code Playgroud)
并像普通表一样操纵这个变量.
我想使用SSMS 2012调试复杂的T-SQL脚本.
我可以在调试模式下运行脚本并放置断点,以及逐步执行我的脚本,但是我看不到存储在表变量中的值.
在Locals窗口中我看到所有这些变量,但它们的值显示为(table):

无法通过上下文菜单或单击变量来查看变量的内容.
我试图使用Immediate Window对表变量运行查询,但这似乎也不起作用.

知道如何从调试会话中的表变量中获取值吗?
我有以下TSQL表变量:
declare @NumDaysMonth table
(
month_id smallint,
num_days smallint
)
Run Code Online (Sandbox Code Playgroud)
我只想快速查看每个月的天数.如何像C数组一样初始化此表:
int numDaysMonth[] = {31, 28, 30, ... , 31};
Run Code Online (Sandbox Code Playgroud) 如何将存储在记录类型变量中的查询结果用于同一存储函数中的另一个查询?我使用Postgres 9.4.4.
用这样的表:
create table test (id int, tags text[]);
insert into test values (1,'{a,b,c}'),
(2,'{c,d,e}');
Run Code Online (Sandbox Code Playgroud)
我写了一个函数(简化),如下所示:
CREATE OR REPLACE FUNCTION func(_tbl regclass)
RETURNS TABLE (t TEXT[], e TEXT[])
LANGUAGE plpgsql AS $$
DECLARE
t RECORD;
c INT;
BEGIN
EXECUTE format('SELECT id, tags FROM %s', _tbl) INTO t;
SELECT count(*) FROM t INTO c;
RAISE NOTICE '% results', c;
SELECT * FROM t;
END
$$;
Run Code Online (Sandbox Code Playgroud)
......但没有奏效:
select func('test');
Run Code Online (Sandbox Code Playgroud)
Run Code Online (Sandbox Code Playgroud)ERROR: 42P01: relation "t" does not exist LINE 1: SELECT count(*) FROM …
我有SQL性能问题.出于突发原因,以下查询非常缓慢:
我有两个列表,其中包含某个表的Id.如果Id已存在于第二个列表中,我需要删除第一个列表中的所有记录:
DECLARE @IdList1 TABLE(Id INT)
DECLARE @IdList2 TABLE(Id INT)
-- Approach 1
DELETE list1
FROM @IdList1 list1
INNER JOIN @IdList2 list2 ON list1.Id = list2.Id
-- Approach 2
DELETE FROM @IdList1
WHERE Id IN (SELECT Id FROM @IdList2)
Run Code Online (Sandbox Code Playgroud)
这两个列表可能包含超过10,000条记录.在这种情况下,两个查询都需要超过20秒才能执行.
执行计划也显示了一些我不理解的东西.也许这就解释了为什么它如此缓慢:

我用10,000个连续的整数填充了两个列表,因此两个列表都包含值1-10.000作为起始点.
正如您所看到的,两个查询显示@ IdList2 实际行数为50.005.000 !!.@ IdList1是正确的(实际行数是10.000)
我知道还有其他解决方案如何解决这个问题.就像填写从第一个列表中删除的第三个列表一样.但我的问题是:
为什么这些删除查询这么慢,为什么我会看到这些奇怪的查询计划?
sql sql-server performance table-variable sql-execution-plan
这是我的一个存储过程的一部分:
@dataInTable dbo.Table_Variable readonly,
....
AND (
( @dataInTable IS NULL )
OR
( item IN ( SELECT T FROM @dataInTable ) )
)
Run Code Online (Sandbox Code Playgroud)
@dataInTable IS NULL 语法错误,错误是
必须声明标量变量"@dataInTable"
所以我把它改成:
(SELECT T FROM @dataInTable) IS NULL
Run Code Online (Sandbox Code Playgroud)
这有效,但如果@dataInTable有多个项目,我收到一个错误:
子查询返回的值超过1.当子查询跟随=,!=,<,<=,>,> =或子查询用作表达式时,不允许这样做.
可以理解,所以我把它改成:
(SELECT TOP(1) T FROM @ProgramRatings) IS NULL
Run Code Online (Sandbox Code Playgroud)
完美的工作,我所拥有的是性能问题.
我想知道,如果有更简单的方法来检查表变量是否为空,比如
AND (
( @dataInTable IS EMPTY )
OR
( item IN ( SELECT T FROM @dataInTable ) )
)
Run Code Online (Sandbox Code Playgroud) 我试图根据条件更新表变量中的列,条件是表变量的ID不存在于不同的表中:
DECLARE @BugRep TABLE(BugCode VARCHAR(50),DevFirstName VARCHAR(50), DevLastName VARCHAR(50), BugDate VARCHAR(20), IsValid VARCHAR(1))
UPDATE @BugRep
SET IsValid = 'N' WHERE NOT EXISTS(SELECT * FROM BUG b WHERE @BugRep.BUGCODE = b.CODE)
Run Code Online (Sandbox Code Playgroud)
当我尝试编译具有这些语句的过程时,我得到一个"必须声明标量变量"@BugRep"消息.
我如何在NOT EXISTS子句中使用表变量?
我正在使用SQL Server 2008
表变量是在内存中还是在tempdb中创建的?短临时表也一样吗?
table-variable ×10
sql-server ×5
t-sql ×5
sql ×4
plpgsql ×2
postgresql ×2
debugging ×1
function ×1
not-exists ×1
null ×1
performance ×1
ssms ×1
variables ×1