我有大约20个存储过程相互消耗,形成一个树状的依赖链.
但是,存储过程使用内存表进行缓存,并且可以从许多不同的客户端同时调用.
为防止针对内存表的并发更新/删除尝试,我使用sp_getapplock和SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT ON;.
我正在使用每个存储过程唯一的存储过程参数的散列,但是对具有相同参数的同一存储过程的多个并发调用应生成相同的散列.对于使用相同参数的同一存储过程的并发调用,这是哈希的相等,这为我提供了一个有用的资源名称来获取我们的applock.
以下是一个例子:
BEGIN TRANSACTION
EXEC @LOCK_STATUS = sp_getapplock @Resource= [SOME_HASH_OF_PARAMETERS_TO_THE_SP], @LockMode = 'Exclusive';
...some stored proc code...
IF FAILURE
BEGIN
ROLLBACK;
THROW [SOME_ERROR_NUMBER]
END
...some stored proc code...
COMMIT TRANSACTION
Run Code Online (Sandbox Code Playgroud)
尽管在应用程序中包装所有内容应该阻止任何并发更新或删除,我仍然得到错误41302:
当前事务尝试更新自此事务启动以来已更新的记录.交易中止.在批处理结束时检测到不可提交的事务.该事务被回滚.
我是否正确使用sp_getapplock?似乎我建议的方法应该有效.
我正在使用clickOnce并与之一起部署安装程序。
我尝试了各种设置。可以将SQL Server 2008 Express和SQL Server 2012 Express用作必备组件(我下载了它们并设置了clickonce选项“从相同的应用程序路径下载必备组件”)。
现在,我正在尝试对SQL Server 2014 Express执行相同的操作。
由于SQL Server 2014 Express软件包在2008年和2012年版本中并不是很糟糕,因此我尝试创建它。
我已经做完了,而且似乎可以使用,但是在安装时却给出了错误号-2054422506。这是一个非常普通的错误,我不理解。
出现一个弹出窗口,表明安装已停止,因为这是安装SQL Server Express 2014并在日志中查找更多信息的错误。日志仅显示:
Installing using command
'C:\Users\VIRTUA~1\AppData\Local\Temp\VSD24F4.tmp\SqlExpress2014\
SQLEXPR32_x86_ITA.EXE' and parameters '/q /action=Install /features=SQL
/instancename=SQLEXPRESS /securitymode=SQL /sapwd=passwd
/sqlsvcaccount="NT Authority\Network Service'
Process exited with code -2054422506
Status of package 'SQL Server 2014 Express' after install is 'InstallFailed'
Run Code Online (Sandbox Code Playgroud)
因此,我尝试不使用ClickOnce手动安装SQL Server 2014 Express,并且它可以正常工作。所以我想我在软件包的xml文件中有些混乱。
我的软件包是这样构建的(在C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ Bootstrapper \ Packages中):
\SqlExpress2014
\it
-SQLEXPR32_x86_ITA.exe
-SQLEXPR_x64_ITA.exe
-eula.rtf
-package.xml …Run Code Online (Sandbox Code Playgroud) 我需要在Visual Studio 2013数据库项目中创建一个包含一些数据库对象的附加模式.我怎样才能做到这一点?
以下是数据示例:
ID Value NumPeriod
------------------------
1681642 596.8 2
1681642 596.8 3
1681663 445.4 2
1681663 445.4 3
1681688 461.9 3
1681707 282.2 3
1681724 407.1 3
1681743 467 2
1681743 467 3
1681767 502 3
Run Code Online (Sandbox Code Playgroud)
我想按[ID]进行分组,只取每组中[Value]的不同值,并根据[NumPeriod]取"first"不同的[Value].所以结果看起来像这样:
ID Value NumPeriod
-------------------------
1681642 596.8 2
1681663 445.4 2
1681688 461.9 3
1681707 282.2 3
1681724 407.1 3
1681743 467 2
1681767 502 3
Run Code Online (Sandbox Code Playgroud)
所以我虽然这样的东西会起作用,但没有运气:
select
ID, distinct(Value), NumPeriod
from
MyTable
group by
ID, Value, NumPeriod
order by
ID, NumPeriod
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.谢谢!
这种情况与SQL Service Broker密切相关- 通信场景 - 从SQL 2008 R2迁移到SQL 2014和SQL Service Broker - 一个中心SQL和更多的卫星SQL ...初学者希望了解详细信息.
从SQL Server 2008 R2 Standard Ed迁移后.到SQL Server 2014 Standard Ed.,相同的代码不起作用.防火墙设置为允许通信.
的sys.transmission_queue(在发送者和接收者服务器)保持空的,并且GenericQueue(我的队列标识符)接收消息.但是,附加到(接收SQL服务器)的过程:
ALTER QUEUE [GenericQueue]
WITH ACTIVATION (
STATUS = ON,
MAX_QUEUE_READERS = 1,
PROCEDURE_NAME = [usp_CentralActivation],
EXECUTE AS OWNER);
Run Code Online (Sandbox Code Playgroud)
未激活.我已将日志消息放入内部以获得有形证据 - 该过程未被调用.
我没有观察到任何错误信息或指示 - 或者我不知道在哪里寻找指示.我怎样才能找到问题所在?我应该在这里发布什么信息以帮助找到原因?
安装服务代理的代码是从模板生成的,除了机器标识(IP地址作为字符串)之外,完全相同的代码在SQL Server 2008 R2上运行良好.
可能EXECUTE AS OWNER是原因吗?谁是谁OWNER?
我有一个我想提交的事务,但不确定是否会在任何失败时回滚.我知道我可以在c#中使用TransactionScope,如果发生错误,所有内容都将被回滚.但我不太确定存储过程中的事务.所有在线示例都使用ROLLBACK关键字回滚.如果我没有ROLLBACK关键字那会怎么样?
CREATE PROCEDURE CreatePost
@type INT,
@name VARCHAR(500)
AS
BEGIN
DECLARE @insertedId TABLE(Id INT)
DECLARE @id INT
BEGIN TRANSACTION
INSERT INTO [Post] ([Name], [Type])
OUTPUT inserted.Id INTO @insertedId
VALUES (@name, @type)
UPDATE [Tables] SET Ordinals =ordinals + 1
WHERE Id = @tableId
COMMIT
END
Run Code Online (Sandbox Code Playgroud) 我有一张3柱和4排的桌子.
Col1 Col2 Col3
Row1 A1 B1 1
Row2 A2 B2 0
Row3 A3 B3 3
Row4 A4 B4 1
Run Code Online (Sandbox Code Playgroud)
一个select * from [table]回报:
A1 B1 1
A2 B2 0
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)
我想要一个选择:
A1 B1 1
A3 B3 3
A3 B3 3
A3 B3 3
A4 B4 1
Run Code Online (Sandbox Code Playgroud)
Col3给出行返回的数量.
我一直使用动态WHERE语句COALESCE()来返回传入的值或返回所有记录.
但是当我需要检查两列时,我似乎无法做到这一点,如果没有传入参数则返回所有记录.这是我的代码片段:
DECLARE @MaxAge INT = NULL --- Example value: 5
SELECT
*
FROM
dbo.Vehicle
WHERE
DATEPART(YEAR, RegistrationDate) <=
CASE
WHEN @MaxAge IS NOT NULL
THEN (DATEPART(YEAR,GETDATE()) - @MaxAge)
ELSE DATEPART(YEAR, RegistrationDate)
END
OR
DATEPART(YEAR, ProductionDate) <=
CASE
WHEN @MaxAge IS NOT NULL
THEN (DATEPART(YEAR,GETDATE()) - @MaxAge)
ELSE DATEPART(YEAR, ProductionDate)
END
Run Code Online (Sandbox Code Playgroud)
我想做的事(用简单的英语)是:
给我车辆表中的所有行,其中RegistrationDate的YEAR部分小于@MaxAge,或者ProductionDate的YEAR部分小于@MaxAge.如果@MaxAge为NULL,那么无论何时制作或注册,都要全部给我.
RegistrationDate如果车辆尚未注册,有时表中的值将为NULL.ProductionDate如果卖家根本不知道何时制作,有时可以为NULL.
解决这个问题的最佳方法是什么?我已经尝试过查看SQL书籍和在线,但是找不到任何可以匹配这种情况的东西.
这是我的查询
INSERT INTO Tbl_DomainWiseStats (subdomainid, tendercount, Type_cat, DisplayText)
SELECT
' + CAST(@domain_id AS VARCHAR(100)) + '
, TenderCount
, ''ByCountry''
,Country
FROM
(SELECT DISTINCT
V.Country,
COUNT(DISTINCT Sr_No) as TenderCount
FROM
dbo.viewgetlivetenders V
WHERE
'+ @Domainquery +'
GROUP BY
V.Country) a
ORDER BY
TenderCount
Run Code Online (Sandbox Code Playgroud)
错误信息:
[SQLSTATE 42000](错误4145)在"GROUP"附近的预期条件的上下文中指定的非布尔类型的表达式
sql sql-server sql-server-2008 sql-server-2012 sql-server-2014
请考虑下表在SQL Server数据库中:
Id ProductName Price Size
-----------------------------------
1 T-Shirt 1000 M
2 Jeans 1800 L
Run Code Online (Sandbox Code Playgroud)
如何将此表转换为以下HTML字符串:
<div class='row' Id='1' size='M'>
<div class='cell'>T-Shirt</div>
<div class='cell'>1000</div>
</div>
<div class='row' Id='2' size='L'>
<div class='cell'>Jeans</div>
<div class='cell'>1800</div>
</div>
Run Code Online (Sandbox Code Playgroud) sql-server-2014 ×10
sql-server ×9
sql ×5
c# ×1
clickonce ×1
concurrency ×1
deployment ×1
distinct ×1
group-by ×1
html ×1
t-sql ×1
xml ×1