我是 SQL-Server Management Studio 的常规用户,但现在我遇到了一个非常奇怪的情况:当我按下F5或单击“执行”时,SQL-Server Management Studio 不会执行我的查询。相反,它会打开“保存结果”对话框,如您所见:
有人见过这种情况吗?你知道如何处理吗?
提前致谢
我正在处理 SQL-Server 数据库中的一些表,并且正在进行一些重要的修改。为了在搞砸时不丢失所有内容,我决定执行“生成脚本”(仅数据,我正在使用 Microsoft SQL Server Management Studio),所以现在我有一堆 SQL“INSERT”命令,例如:
INSERT [dbo].[User_Group_Access] ([Visible], [GroupId], [Enabled], [ControlId], [Administrator]) VALUES (0, 26, 0, 181, 0)
INSERT [dbo].[User_Group_Access] ([Visible], [GroupId], [Enabled], [ControlId], [Administrator]) VALUES (0, 26, 0, 182, 0)
哎呀,我做错事了。
没问题,我想。只需替换INSERT
即可UPDATE
,但这似乎并不那么简单:在 StackOverflow 上查找这个问题,有关于事务、不同数据库技术的完整讨论,...
好吧,该UPDATE
命令不起作用。
但是应该还有其他命令(REPLACE
不起作用,SUBSTITUTE
不作为命令存在),不是吗?
有人有想法吗?
提前致谢
我正在开发一个多线程应用程序 (VB.Net/C#),它正在处理 SQL 服务器数据库。
通常,我的客户抱怨应用程序显示“死锁”-like 关于所谓的 SQLClient 的异常,并且通过重新启动应用程序,一切都再次正常运行(一段时间)。
根据描述,我不相信我的客户面临真正的死锁(一个线程在等待另一个线程),但我相信我正在处理两个数据库请求,很可能在同一个表上,一个事务需要那么多它阻止其他交易的时间,但这只是一个猜测,我想确定这一点。为此,我正在考虑询问数据库哪些线程当前正在访问哪些表,希望这能给我一些信息。
在此处的网站上搜索时,我发现了另一个问题dm_db_index_operational_stats
中提到的表格,但作为一个新手,这看起来很复杂,因此我想问一个简单的问题:
我如何知道哪个应用程序的哪些线程当前正在访问我的 SQL 服务器数据库中的哪些表?显然,信息(进程 ID、线程 ID、线程名称、调用堆栈的(上部)……)越多越好。
这存在吗?
就可能的解决方案而言:
我的应用程序基于此 DLL:
"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0\System.Data.dll"
...为了访问数据库执行以下操作(例如删除过时的条目):
Public Shared Sub ExecuteSQL(ByVal sSQL As String, ByVal ParamArray dbParams() As SqlParameter)
Dim oCommand As SqlCommand = Nothing
Try
oCommand = BuildCommand(sSQL, dbParams)
oCommand.CommandTimeout = 60
oCommand.ExecuteNonQuery()
Catch ex As Exception
Debug.WriteLine(ex.Message)
Throw
Finally
If oCommand IsNot Nothing Then ReleaseConnection(oCommand.Connection)
End Try
End Sub
我想添加一个锁定机制以避免此类问题,例如:
DatabaseConnection.Lock_Table("Table_which_is_handled");
ExecuteSQL(...); // working on "Table_which_is_handled"
DatabaseConnection.Release_Lock_Table("Table_which_is_handled");
这存在吗?
有人有想法吗?
提前致谢
与Dan Huzman讨论后编辑:Dan Huzman提到的
这个答案提到了以下 SQL 查询:
--Get xml_deadlock_report events from system_health session file target
WITH
--get trace folder path and append session name with wildcard (assumes base file name is same as session name)
all_trace_files AS (
SELECT path + '\system_health*.xel' AS FileNamePattern
FROM sys.dm_os_server_diagnostics_log_configurations
)
--get xml_deadlock_report events from all system_health trace files
, deadlock_reports AS (
SELECT CAST(event_data AS xml) AS deadlock_report_xml
FROM all_trace_files
CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS trace_records
WHERE trace_records.object_name like 'xml_deadlock_report'
)
SELECT TOP 10
deadlock_report_xml.value('(/event/@timestamp)[1]', 'datetime2') AS UtcTimestamp
, deadlock_report_xml AS DeadlockReportXml
FROM deadlock_reports;
这是指位于客户计算机上的一些文件,很可能位于目录“C:\Program Files\Microsoft SQL Server\MSSQL15.SQLEXPRESS\MSSQL\Log”中(为了确定,请检查SELECT path FROM sys.dm_os_server_diagnostics_log_configurations
)。
我可以检索提到的“system_health*.xel”文件并将它们放在我的本地计算机上(假设在目录“C:\Temp_Folder”中),然后启动以下新查询:
--Get xml_deadlock_report events from system_health session file target
WITH
--get trace folder path and append session name with wildcard (assumes base file name is same as session name)
all_trace_files AS (
SELECT 'C:\Temp_Folder\system_health*.xel' AS FileNamePattern
FROM sys.dm_os_server_diagnostics_log_configurations
)
--get xml_deadlock_report events from all system_health trace files
, deadlock_reports AS (
SELECT CAST(event_data AS xml) AS deadlock_report_xml
FROM all_trace_files
CROSS APPLY sys.fn_xe_file_target_read_file ( FileNamePattern, NULL, NULL, NULL) AS trace_records
WHERE trace_records.object_name like 'xml_deadlock_report'
)
SELECT deadlock_report_xml.value('(/event/@timestamp)[1]', 'datetime2') AS UtcTimestamp
, deadlock_report_xml AS DeadlockReportXml
FROM deadlock_reports;
这是否会为我提供我正在寻找的信息,或者我是否需要在客户的计算机上打开 Microsoft SQL Server Management Studio 会话?
在我之前的问题中,我询问了如何知道我的 SQL-Server 2019 数据库中发生了什么。过了一会儿,我发现有一种表格,叫做fn_dblog
,它提供了一些有趣的信息,但我仍然有一些问题(字面意思是从上一个问题复制而来):
SELECT Top 10 [Begin Time] [End Time]
FROM fn_dblog(null,null)
WHERE UPPER(AllocUnitName) LIKE '%TABLENAME_STATUS%'
...由我的 Microsoft SQL Server Management Studio 提出的位置[Begin Time]
和位置。[End Time]
令我惊讶的是,结果如下所示:
Title: End Time
NULL
...
NULL
现在我有以下问题:
[Begin Time]
柱子怎么了?[End Time]
没有填写?fn_dblog
,列名不会出现在剪贴板中。为什么会这样,我该如何改变呢?除此之外,我还发现了另一个“表”,名为fn_full_dblog
,但更糟糕的是:
SELECT Top 10 *
FROM sys.fn_full_dblog(null,null, null, null, null, null,
null, null, null, null,null)
WHERE UPPER(AllocUnitName) LIKE '%TABLENAME_STATUS%'
=> 根本没有结果!
有人可以给我一些关于如何阅读fn_dblog
以及可能fn_full_dblog
或任何其他可能使用有趣信息的“表格”的信息吗?
提前致谢
我正在开发一个 SQL 服务器数据库,其中包含订单和机器,执行这些订单。一台机器不能同时分配一个以上的活动订单。换句话说:这个 SQL 请求永远不会产生结果:
SELECT MachineId
FROM Orders
WHERE (Orders.Status=1)
GROUP BY MachineId
HAVING COUNT(Id)>1
我在 Microsoft SQL Server Management Studio 环境中打开了这个 SQL 请求,每次按F5时,我确实看不到任何结果。
但是,我确信 SQL 查询在某些时候确实会产生结果,并且我对那些时间以及那个时候该查询的结果很感兴趣。
有人知道我如何找到这个吗?(“归档日志”标签只是一个想法)
提前致谢
我有一个简单的 SQL 文件用于执行一些测试:
DECLARE @VAR1 AS VARCHAR(100) = '12345'
DECLARE @VAR2 AS INTEGER = 54321
WAITFOR DELAY '00:00:02'
INSERT Orders SELECT @VAR1 AS COL1, @VAR2 AS COL2, ...
...
在启动所有这些之前,我想做一些清洁工作:
/* Clean SpecialSubSubEntries */
DELETE SpecialSubSubEntries
WHERE Id IN (SELECT Id FROM SubSubEntries
WHERE SubEntryId IN (SELECT Id FROM SubEntries
WHERE EntryId IN (SELECT Id FROM Entries
WHERE Name='ENTRY01')
)
)
DELETE SubSubEntries
WHERE SubEntryId IN (SELECT Id FROM SubEntries
WHERE EntryId IN (SELECT Id FROM Entries
WHERE Name='ENTRY01')
)
...
出于可读性的原因,我想将所有清理命令放在一个文件“cleanup.sql”中,并在我的 SQL 文件的开头启动它。我该怎么做这样的事情?
我想它是这样的:
EXECUTE ".\cleanup.sql"
...但我不确定语法。
我正在安装应用程序和数据库。
为了检查文件是否正确,我可以简单地取校验和。
有没有办法检查表格是否正确?(我意识到我可以将整个表放入一个文件并获取该文件的校验和,但也许有更简单的方法。)
我正在开发一个程序,该程序将“预测”表中下一个可能的元组。
其中一个功能是发现算术级数,有不同的方法可以做到这一点:
System.Data.DataTable
,检查DataTable.Columns[i].AutoIncrement
(我正在使用 .Net (C#))这个问题是关于最后一部分的。我能够从列中获取所有数据,将它们下载到列表中,并检查下载列表中是否有算术级数,但我想知道是否有一种简单的 SQL 方法可以做到这一点,例如:
SELECT MAX(Col1 - Previous_Tupple.Col1) FROM Table1
SELECT MIN(Col1 - Previous_Tupple.Col1) FROM Table1
如果两个结果相等(而不是零),那么我在Col1
from中有一个算术级数Table1
。
我已经找到了一种访问上一个和下一个元组的方法,使用LAG
和LEAD
SQL 函数,如下所示:
SELECT
t.Col1 - LAG(t.Col1) OVER (ORDER BY t.Col1)
FROM Table1 t
现在我只有两个问题要解决:
SELECT MAX(t.Col1 - LAG(t.Col1) OVER (ORDER BY t.Col1)) FROM Table1 t
Msg 4109, Level 15, Windowed functions cannot be used in the context of another windowed function or aggregate.
LAG
返回NULL
,所以这可能会影响MAX
和MIN
计算所以我的问题是:我如何计算基于 - 的 SQL 查询的MAX
and ,同时删除烦人的- 值?MIN
LAG
NULL
我有一个包含十个字段f1
(作为整数字段)到f10
(作为字符字段)的表。中间还有其他整数、字符和日期字段。
我想将这些字段定义复制到另一个表中,而无需重新编写整个定义。我正在使用数据字典,它似乎没有涵盖此功能。
在第一个答案后编辑第
一个答案提到了如何在运行时执行此操作,但我专门在设计时寻找解决方案。
编辑
我发现有不同的命令行实用程序可用于处理 Progress 数据库:ProDB
用于创建新数据库,ProUtil
用于执行多项任务(但我没有找到ProUtil <add a field to a table>
)。
我怎样才能做到这一点?