在 SQL Server 2012 中,我有一个表值函数,它连接到另一个表,我需要计算这个“表值函数”的行数。当我检查执行计划时,我可以看到左连接表。为什么?左连接表如何影响返回的行数?我希望数据库引擎不需要在 SELECT count(..) 查询中评估左联合表。
Select count(realtyId) FROM [dbo].[GetFilteredRealtyFulltext]('"praha"')
Run Code Online (Sandbox Code Playgroud)
执行计划:
表值函数:
CREATE FUNCTION [dbo].[GetFilteredRealtyFulltext]
(@criteria nvarchar(4000))
RETURNS TABLE
AS
RETURN (SELECT
realty.Id AS realtyId,
realty.OwnerId,
realty.Caption AS realtyCaption,
realty.BusinessCategory,
realty.Created,
realty.LastChanged,
realty.LastChangedType,
realty.Price,
realty.Pricing,
realty.PriceCurrency,
realty.PriceNote,
realty.PricePlus,
realty.OfferState,
realty.OrderCode,
realty.PublishAddress,
realty.PublishMap,
realty.AreaLand,
realty.AreaCover,
realty.AreaFloor,
realty.Views,
realty.TopPoints,
realty.Radius,
COALESCE(realty.Wgs84X, ruian_cobce.Wgs84X, ruian_obec.Wgs84X) as Wgs84X,
COALESCE(realty.Wgs84Y, ruian_cobce.Wgs84Y, ruian_obec.Wgs84Y) as Wgs84Y,
realty.krajId,
realty.okresId,
realty.obecId,
realty.cobceId,
IsNull(CONVERT(int,realty.Ranking),0) as Ranking,
realty.energy_efficiency_rating,
realty.energy_performance_attachment,
realty.energy_performance_certificate,
realty.energy_performance_summary,
Category.Id AS CategoryId,
Category.ParentCategoryId,
Category.WholeName,
okres.nazev AS …Run Code Online (Sandbox Code Playgroud) 我们有一个 Always On 可用性组,其中包含一个主要和一个已启用读取的次要。我们有一个实施团队的用户,他使用数据库来检查他们打算放入数据库的数据的正确性。
用户只有从数据库读取的权限,但是当他们通过 AG 侦听器连接(通过 SSMS)时,他们总是连接到活动节点。
我试图让他们直接访问只读实例,但他们坚持自己的方式,一两天后他们又回到了活动节点上。
SQL Server 有没有办法说这个用户总是打算只读并将他们重定向到那里?
注意:我已经尝试在附加连接参数中设置“ApplicationIntent = ReadOnly”,但这似乎没有重定向到辅助节点,并且不是理想的解决方案,因为他们不可避免地会忘记为新的初学者设置它。
SQL Server 2012 Enterprise,可用性组 1 主要,1 可读次要同步提交。
我不打算让用户连接到链接服务器,或通过任何其他服务器。用户通过 SSMS(没有其他应用程序)直接连接到数据库,我希望 AG 侦听器(或那里的其他东西)能够将该用户引导到一个可用的辅助节点(因为它只有读取访问权限)访问主节点是没有意义的)而用户无需做任何事情,因为他们在机器周围移动并且会忘记添加应用程序意图。此外,我发现将其添加到其他连接参数并不总是将您定向到辅助节点。
sql-server configuration sql-server-2012 listener availability-groups
我有一个涉及在多个数据库之间执行各种命令的过程 - 但是,当我使用动态 SQL 通过“使用 @var”更改数据库时,它实际上并没有更改数据库。
在 [test_db] 中执行:
declare @currentDB varchar(max)
declare @sql varchar(max)
set @currentDB = DB_NAME()
set @sql = 'use [' + @currentDB +']'
use master
exec(@sql)
select DB_NAME()
Run Code Online (Sandbox Code Playgroud)
返回 [Master] 作为当前数据库名称 - 如果我将其use [test_db]作为命令而不是动态放置,则它返回正确的名称。
有没有办法做到这一点,可以在数据库之间正确切换?
我有一个客户端 c# 程序,它通过 执行存储过程ExectueNonQuery,包括PRINT使用 InfoMessage 事件捕获和错误输出。它工作正常,但我注意到一些奇怪的事情。
当我从 SSMS 执行存储过程时,它会显示在“消息”选项卡中执行的每个单独 SQL 语句的行数(就好像它来自 InfoMessages)。然而,我的程序从未看到这些消息,尽管它确实捕获了所有相同的其他输出。相反,它只返回 ExecuteNonQuery 函数结果中受影响的行,即所有单个行计数的总和(这是一种无用的)。
例如,这个过程:
use [tempdb]
go
SELECT *
INTO MyCols
FROM sys.columns
go
CREATE PROC foo As
UPDATE MyCols
SET name = name + N''
-- SSMS shows (662 row(s) affected)
UPDATE MyCols
SET name = name + N''
WHERE name like '%x%'
-- SSMS shows (59 row(s) affected)
PRINT 'bar'
-- both SSMS and ExecuteNonQuery get this
-- ExecuteNonQuery returns 721 rows affected …Run Code Online (Sandbox Code Playgroud) 我使用 Adam Machanic 的出色sp_WhoIsActive过程来查看活动并记录到表中以对长时间运行的查询进行故障排除。
为什么执行计划没有一直显示在结果中?大多数情况下,该query_plan值为 NULL。如果我查看结果中的SQL_TEXT列,我会看到带有参数但没有值的查询,如下所示:
(@P0 nvarchar(4000),@P1 nvarchar(4000))
select blah from foo where a = @P0 and b = @P1
Run Code Online (Sandbox Code Playgroud)
执行计划未显示在此处时如何获取它们?他们为什么不显示?我必须使用 Profiler 或扩展事件吗?将虚拟值放入这些参数并运行包含实际执行计划的查询是否会生成与我记录时实际使用的计划相同的计划?
我已经与供应商确认他们正在使用 Hibernate 3.5。
performance sql-server stored-procedures execution-plan sp-whoisactive query-performance
我下载了适用于 MS SQL Server 2014 Express 的 LocalDB 和 Management Studio,以便我可以在本地机器上练习。但是,当我打开 Management Studio 并尝试浏览到 localDB 以连接到启动创建的数据库时,我无法找到 localDB。
有人可以帮助我吗?
我有一个在十几个数据库中使用的函数。我希望这个函数只写一次就可以在所有数据库中访问,所以我想把这个函数写在 master 数据库中,以便我的函数可以轻松访问。
在master db中编写用户定义的函数有什么问题吗?
上网时,有人建议将功能转换为系统功能。(使用“EXEC sp_ms_marksystemobject 'fn_db_name'”)。
是否有必要将master db中创建的函数转换为系统函数?如果是,为什么?
比较两个大型结果/行集的最有效方法的当前建议似乎是使用EXCEPT运算符。随着行大小的增加(更改@last 值),下面这个自包含的 SQL 脚本变得非常低效。我试图在组合表中找到唯一的条目,但没有任何改进。
DECLARE @first AS INT, @step AS INT, @last AS INT;
-- This script is comparing two record sets using EXCEPT
-- I want to find additions from OLD to NEW
-- As number of rows increase performance gets terrible
-- I don't have to use two tables. I could use one combined table but I want the same result as quickly as possible
-- Compare 100 to 110 rows - 0 seconds
-- Compare …Run Code Online (Sandbox Code Playgroud) 我正在查看 AlwaysOn 可用性组。我越看它就越发现可用性侦听器组是单点故障。侦听器究竟在哪里运行?一个单独的服务器,主SQL服务器,所有这些?
假设我在我的第二个数据中心有一个完整的应用程序堆栈。如何配置侦听器,以便它们在两个站点上运行并且应用程序将指向它们自己的本地副本?
我确定我在这里遗漏了一些东西,但我不知道是什么。
我是一家没有 DBA 的小商店的开发人员,我正在尝试使用 sql server 2012 进行日志传送。我正在尝试将报告从事务系统卸载到新的数据仓库,并将使用此数据库作为暂存区。
我运行了日志传送向导,每次都可以运行主备份和文件复制作业。辅助还原作业似乎随机失败。
主服务器只有一个事务日志作业。差异备份被禁用(不确定这是否重要)但有完整备份。
辅助服务器是全新安装,没有维护计划、备份或活动用户。
有没有办法强制备份恢复同步,或者始终确保它保持同步?
它只是看起来很脆弱。请指教。
编辑日志如下:
*Starting transaction log copy.
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieving copy settings.
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieved copy settings.
Primary Server: '',
Primary Database: 'db', Backup Source Directory: '\\server\folder',
Backup Destination Directory: '\\server\folder',
Last Copied File: '\\server\folder\db_20160105070002.trn'
Starting transaction log restore.
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Retrieving restore settings.
Secondary ID: 'b58d7ce8-2fd7-4cec-b5bd-f3c5e5d3c0f7'
Copying log backup files.
Primary Server: 'server', Primary Database: 'db',
Backup Source Directory: '\\server\folder',
Backup Destination Directory: '\\server\folder'
Retrieved common …Run Code Online (Sandbox Code Playgroud) sql-server ×10
ado.net ×1
count ×1
dynamic-sql ×1
except ×1
functions ×1
installation ×1
listener ×1
log-shipping ×1
performance ×1