我有一个包含一些动态 SQL 的存储过程。我正在尝试使用执行存储过程,OPENROWSET但出现错误:
消息 11514,级别 16,状态 1,过程 sp_describe_first_result_set,第 1 行
无法确定元数据,因为语句 'EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;' 在过程 'nachoTest' 中包含动态 SQL。考虑使用 WITH RESULT SETS 子句来显式描述结果集。
我真正的存储过程有点复杂,但这是错误的一个工作示例:
存储过程:
CREATE PROCEDURE nachoTest @table_name NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @row_count_table INT
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = N'SELECT @row_count_out = COUNT(*) FROM ' + @table_name
EXEC sp_executesql @SQL, N'@row_count_out INT OUTPUT', @row_count_out = @row_count_table OUTPUT;
SELECT @row_count_table AS row_count, @table_name AS table_name
END
GO
Run Code Online (Sandbox Code Playgroud)
调用它 …
sql-server stored-procedures dynamic-sql openrowset sql-server-2014
我最近被问到这个问题,但我在互联网上找不到有关此问题的答案或任何详细解释。任何人都可以解释或提供一个参考链接来解释处理用户登录请求的 SQL Server 体系结构的组件吗?
提前致谢!!
我正在构建一个 SQL Server AlwaysOn AG,我正在执行手动和自动的“故障转移”步骤:
我注意到在 Windows Server 故障转移群集中存在一个“当前主机服务器”。据我所知,这是集群托管的集群的“主人”。但是现在我注意到托管可用性组(-role)的“所有者节点”可能是另一个节点。(owner节点也是AG的主实例吧?)
现在对我来说,AlwaysOn AG 的正常运行存在两个问题:
Q1:“当前主机服务器”是否应该与 AlwaysOn AG 的所有者节点相同?
Q2:想象一下,如果我想维护一个主机。我是否应该首先将 AG(通过 SSMS 或使用 ALTER AVAILABILITY GROUP...)故障转移到第二个节点/另一个节点,然后再故障转移 WSFC-Current 主机?
也许有人可以帮助我解决这些问题并给我一些建议。
谢谢
我需要一些帮助来弄清楚如何将表连接到我的查询中。表名每天都在更改,因为表名中使用了日期,而旧表因不再需要而被删除。
我的查询查找在数据库中有数据并且正在处理的“扫描”(因为缺少更好的词)。
我目前的查询是:
USE RetinaCSDatabase
SELECT S.ScanID [Scan ID], S.PolicyName [Scan], DATEADD(hh, +2, S.StartTime) [Scan Start], A.AssetName [Scanner], COUNT(AIPS.AssetIPID) [Hosts], S.TransactionGroup [Transaction Group ID]
FROM Scan S (NOLOCK)
LEFT JOIN Scanner SC (NOLOCK) ON S.ScannerID = SC.ScannerID
LEFT JOIN Asset A (NOLOCK) ON SC.AssetID = A.AssetID
LEFT JOIN Asset_IP_Scan AIPS (NOLOCK) ON S.ScanID = AIPS.ScanID
WHERE S.ProcessStatus < 2
GROUP BY S.ScanID, S.PolicyName, S.StartTime, A.AssetName, S.TransactionGroup
ORDER BY S.StartTime ASC, S.PolicyName ASC, A.AssetName ASC
Run Code Online (Sandbox Code Playgroud)
我需要加入的是包含仍需要处理的数据的表。这些表以名称“evt_scan_”开头,然后是日期。因此,例如,完整的表名将是“evt_scan_20171222”。2017 年 12 月 22 日执行的扫描数据将在表“evt_scan_20171222”中包含数据,并且可能在接下来的几天表“evt_scan_20171223”中包含数据。所以,我首先需要我的查询来检查表是否存在,然后加入它进行计数并检查接下来的天表是否存在,加入它进行另一个计数并将 …
下面的两个 T-SQL 命令有区别吗?
带引号的列名
SELECT SUM(DATALENGTH('ColumnName')) / 1048576.0 AS ColumnName
FROM DatabaseName.Schema.Tablename
Run Code Online (Sandbox Code Playgroud)不带引号的列名
SELECT SUM(DATALENGTH(ColumnName)) / 1048576.0 AS ColumnName
FROM DatabaseName.schema.Tablename
Run Code Online (Sandbox Code Playgroud)我有以下存储过程需要将近一个小时才能完成。结果集大约有 20 万台机器。
我所做的只是从链接服务器中提取一组 id,在本地服务器中删除这些 id,然后从远程服务器中提取这些 id 的所有详细信息并插入它们。INSERT 占 90%,DELETE 表占 9%,SELECT INTO 占 1%。
id 是主键/聚集索引。
DECLARE @ProcessDate DATETIME
SET @ProcessDate = CONVERT(VARCHAR(10), DATEADD(DAY, -3,
GETDATE()), 111)
SELECT DISTINCT id
INTO #temp_machines
FROM remote_server.db.dbo.table1
WHERE dt_modify >= @ProcessDate
DELETE FROM local_server.db.dbo.table2
WHERE id IN ( SELECT id FROM #temp_machines )
INSERT INTO local_server.db.dbo.table2
SELECT *
FROM remote_server.db.dbo.table1
WHERE id IN ( SELECT id FROM #temp_machines )
Run Code Online (Sandbox Code Playgroud)
有什么关于提高性能的建议吗?
performance sql-server-2008 sql-server linked-server query-performance
当我尝试使用以下命令恢复我的数据库时
RESTORE DATABASE MyDatabase
FROM DISK = '\path\to\my\backup.bak'
WITH REPLACE, RECOVERY
Run Code Online (Sandbox Code Playgroud)
它说
无法获得独占访问权限,因为数据库正在使用中。
经过一些谷歌搜索后,我尝试了这个:
ALTER DATABASE MyDatabase SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
RESTORE DATABASE MyDatabase
FROM DISK = '\path\to\my\backup.bak'
WITH REPLACE, RECOVERY
GO
Run Code Online (Sandbox Code Playgroud)
然而,这似乎需要很长时间,当我最终取消命令时,它告诉我
不合格的事务正在被回滚。预计回滚完成:0%。
该消息重复多次,进度始终为 0%。
我不是 DBA——遗憾的是我的公司没有雇用任何人——而且我不知道从哪里开始。
我正在为即将到来的基础设施变化起草一份提案。这将包括一个生产服务器和报告/数据仓库服务器,每个服务器都具有 Always On。为了降低硬件和许可成本,是否可以在运行 Prod-AG Primary 和 Rep-AG Secondary 的 Server-A 以及运行 Rep-AG Primary 和 Prod-AG Secondary 的 Server-B 的配置中运行?
我认为每个服务器都需要 2 个以下 WSFC 实例、sql 实例、AG、侦听器、DNS 名称/端口。
我希望这是有道理的,这是我认为它会是什么样子的图表。
在任一节点上发生故障转移的情况下,工作负载/业务需求并不是那么大,在同一台服务器上运行几个小时将是一个主要问题。
我只发现了几次类似的设置,但没有来自 Microsoft 或成功运行此设置的任何人的明确信息。
SQL 版将是 2017 年,很可能是标准版,我认为我们不会被批准用于企业版。操作系统将是 Windows Server 2016 Core。
我试图将数据存储在一个表变量中@coordinates,该变量包含 2 行和 2 列:纬度和经度。
存储价值:
declare @coordinates table(latitude decimal(12,9), longitude decimal(12,9))
insert into @coordinates select latitude, longitude from loc.locations where place_name IN ('Delhi', 'Mumbai')
Run Code Online (Sandbox Code Playgroud)
查看值:
select * from @coordinates
Run Code Online (Sandbox Code Playgroud)
结果:
latitude longitude
28.666670000 77.216670000
19.014410000 72.847940000
Run Code Online (Sandbox Code Playgroud)
但我想一一访问这些值,例如:@coordinates[1][1] 或 @coordinates.latitude[1]
或任何可能的简单方法?
可以使用 SQL Server Standard 创建的侦听器数量是否有限制?
我正在与使用 CU3 设置 2017 标准服务器的 DBA 合作。我们有 12 个数据库,他能够设置 12 个基本可用性组。他能够设置 10 个侦听器,但在 11 日,出现以下错误:
为可用性组侦听器“test12300”创建失败。(Microsoft.SqlServer.Smo)
如需帮助,请单击:http : //go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=14.0.17213.0+((SSMS_Rel).171128-2020)&EvtSrc=Microsoft.SqlServer.Management.Smo.ExceptionTemplates。 FailedOperationExceptionText&EvtID=Create+AvailabilityGroupListener&LinkId=20476
附加信息:
执行 Transact-SQL 语句或批处理时发生异常。(Microsoft.SqlServer.ConnectionInfo)
WSFC 群集无法使 DNS 名称为“test12300”的网络名称资源联机。DNS 名称可能已被使用或与现有名称服务冲突,或者 WSFC 群集服务可能未运行或可能无法访问。使用不同的 DNS 名称来解决名称冲突,或查看 WSFC 群集日志以获取更多信息。尝试为侦听器创建网络名称和 IP 地址失败。如果这是一个 WSFC 可用性组,WSFC 服务可能未运行或在其当前状态下可能无法访问,或者为网络名称和 IP 地址提供的值可能不正确。检查 WSFC 群集的状态并与网络管理员一起验证网络名称和 IP 地址。否则,请联系您的主要支持提供商。(Microsoft SQL Server,错误:19471)
如需帮助,请单击:http : //go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=14.00.3015&EvtSrc=MSSQLServer&EvtID=19471&LinkId=20476
我们创建了 11 个空数据库,对每个数据库进行了备份,然后通过 AG 向导使用 DHCP 创建了一个 AG 和一个侦听器。它工作了 10 次,但在第 11 次失败了。对于第 11 个侦听器,我们选择了名称 BAG_L11,没有其他东西使用该 DNS 名称。
sql-server listener availability-groups standard-edition sql-server-2017
sql-server ×10
clustering ×2
dynamic-sql ×1
listener ×1
openrowset ×1
performance ×1
restore ×1
t-sql ×1