试图解决:
我想我偶然发现了一个解决方案,我想看看它是否是一种解决问题的犹太方式.
(简短摘要)我想对一个记录ID列表进行linq-join,这些记录id不是(完全或至少很容易)在SQL中生成的.这是一个很大的列表,经常超过TDS RPC调用的2100项限制.所以我在SQL中所做的就是把它们放在一个临时表中,然后在我需要它时加入它.
所以我在Linq做了同样的事情.
在我的MyDB.dbml文件中,我添加了:
<Table Name="#temptab" Member="TempTabs">
<Type Name="TempTab">
<Column Name="recno" Type="System.Int32" DbType="Int NOT NULL"
IsPrimaryKey="true" CanBeNull="false" />
</Type>
</Table>
Run Code Online (Sandbox Code Playgroud)
打开设计器并关闭它会在那里添加必要的条目,但为了完整起见,我将引用MyDB.desginer.cs文件:
[Table(Name="#temptab")]
public partial class TempTab : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _recno;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnrecnoChanging(int value);
partial void OnrecnoChanged();
#endregion
public TempTab()
{
OnCreated();
}
[Column(Storage="_recno", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int recno
{
get …Run Code Online (Sandbox Code Playgroud) 如何检查SQL服务器中是否存在全局临时表,如果是,则删除该全局临时表?
我正在尝试执行此操作:
IF OBJECT_ID('##Table', 'U') IS NOT NULL
DROP TABLE ##Table
Run Code Online (Sandbox Code Playgroud)
......但它不起作用.
我有一个存储过程,我在其中创建一个临时表,通常包含1到10行.在存储过程中,此表被截断并填充多次.它被截断,因为这比删除更快.当我因使用删除而受到惩罚(截断对表变量不起作用)时,通过用表变量替换此临时表,我是否可以获得任何性能提升
虽然表变量主要在内存中,并且通常比临时表更快,但是我必须通过删除而不是截断来获得任何好处吗?
我目前有一个脚本正在运行,并且认为运行不会花这么长时间,脚本正在修改临时表.
我知道临时表只存在于当前会话中,但无论如何都要查看它们在会话外保存的数据吗?
原因是我想知道我的脚本将继续运行多长时间,如果我能看到临时数据,那么我就能弄明白.
我有一个原始ID列表,我应该放入临时表.我不确定它在SQL Server中是如何工作的:
我知道一般格式:
select PID into #myPIDs
from ... ?
Run Code Online (Sandbox Code Playgroud)
我已经有一个大约30个PID的列表,我将使用它.他们看起来像这样:
'U388279963',
'U388631403',
'U389925814'
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?谢谢!
为什么临时表比SQL Server中的连接的表变量更快?
注意:在两种情况下,表都有PK,表通过PK与其他"物理"表连接.
我试图将两个select语句执行到一个查询,将数据泵入临时表.第一个查询将有5列,而第二个查询只有一列.
第一个可以通过以下方式实现:
Select a.ID AS [a],
b.ID AS [b],
c.ID AS [c]
INTO #testingTemp
FROM
....
Run Code Online (Sandbox Code Playgroud)
现在我有第二个查询试图将数据输入#testingTemp:
Select z.ID AS [c]
INTO #testingTemp
FROM
....
Run Code Online (Sandbox Code Playgroud)
但我的问题是There is already an object named #testingTemp in the database?
我试图在互联网上搜索解决方案,但大多数人只是在我的第一部分面临问题,但显然没有人试图在第二次查询时扩展临时表?
在对我的存储过程进行了许多更改之后,我认为它需要重新分解,主要是因为代码重复.如何克服这些重复:
IF @transExist > 0 BEGIN
IF @transType = 1 BEGIN --INSERT
SELECT
a.dayDate,
a.shiftName,
a.limit,
b.startTimeBefore,
b.endTimeBefore,
b.dayAdd,
b.name,
b.overtimeHours,
c.startTime,
c.endTime
INTO
#Residence1
FROM
#ShiftTrans a
RIGHT OUTER JOIN #ResidenceOvertime b
ON a.dayDate = b.dayDate
INNER JOIN ShiftDetails c
ON c.shiftId = a.shiftId AND
c.shiftTypeId = b.shiftTypeId;
SET @is_trans = 1;
END ELSE BEGIN
RETURN ;
END
END ELSE BEGIN
IF @employeeExist > 0 BEGIN
SELECT
a.dayDate,
a.shiftName,
a.limit,
b.startTimeBefore,
b.endTimeBefore,
b.dayAdd,
b.name,
b.overtimeHours,
c.startTime,
c.endTime
INTO
#Residence2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Postgres的tablefunc扩展CROSSTAB功能对某些数据执行数据透视操作.数据需要首先进行一些转换,我在一些常见的表表达式中执行.
但是,它似乎CROSSTAB无法看到那些表达式的结果.
例如,从临时表中获取数据的查询工作正常:
CREATE TEMPORARY TABLE
temporary_table
(name, category, category_value)
ON COMMIT DROP
AS (
VALUES
('A', 'foo', 1 ),
('A', 'bar', 2 ),
('B', 'foo', 3 ),
('B', 'bar', 4 )
);
SELECT * FROM
CROSSTAB(
'SELECT * FROM temporary_table',
$$
VALUES
('foo'),
('bar')
$$
) AS (
name TEXT,
foo INT,
bar INT
);
Run Code Online (Sandbox Code Playgroud)
并且,如预期的那样,产生以下输出:
name | foo | bar
text | integer | integer
---- | ------- …Run Code Online (Sandbox Code Playgroud) 我试图使用临时表与SQLAlchemy,并将其连接到现有的表.这就是我到目前为止所拥有的
engine = db.get_engine(db.app, 'MY_DATABASE')
df = pd.DataFrame({"id": [1, 2, 3], "value": [100, 200, 300], "date": [date.today(), date.today(), date.today()]})
temp_table = db.Table('#temp_table',
db.Column('id', db.Integer),
db.Column('value', db.Integer),
db.Column('date', db.DateTime))
temp_table.create(engine)
df.to_sql(name='tempdb.dbo.#temp_table',
con=engine,
if_exists='append',
index=False)
query = db.session.query(ExistingTable.id).join(temp_table, temp_table.c.id == ExistingTable.id)
out_df = pd.read_sql(query.statement, engine)
temp_table.drop(engine)
return out_df.to_dict('records')
Run Code Online (Sandbox Code Playgroud)
这不会返回任何结果,因为插入语句to_sql不会运行(我认为这是因为它们运行使用sp_prepexec,但我不完全确定).
然后,我尝试只是写出来的SQL语句(CREATE TABLE #temp_table...,INSERT INTO #temp_table...,SELECT [id] FROM...),然后运行pd.read_sql(query, engine).我收到错误消息
此结果对象不返回行.它已自动关闭.
我想这是因为声明不仅仅是SELECT?
我该如何解决这个问题(任何一个解决方案都可以工作,虽然第一个会更好,因为它避免了硬编码的SQL).要清楚,我无法修改现有数据库中的模式 - 它是供应商数据库.
temp-tables ×10
sql-server ×6
sql ×4
t-sql ×2
crosstab ×1
database ×1
join ×1
linq ×1
mysql ×1
pandas ×1
pivot ×1
postgresql ×1
python ×1
refactoring ×1
sqlalchemy ×1