标签: sql-server-2014

sp_getapplock用于同步对内存表的并发访问

我有大约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?似乎我建议的方法应该有效.

sql-server concurrency stored-procedures sql-server-2014

2
推荐指数
1
解决办法
1051
查看次数

将SQL Server 2014 Express软件包安装为ClickOnce必备软件

我正在使用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)

c# sql-server deployment clickonce sql-server-2014

2
推荐指数
1
解决办法
3162
查看次数

如何在Visual Studio 2013数据库项目中添加新架构

我需要在Visual Studio 2013数据库项目中创建一个包含一些数据库对象的附加模式.我怎样才能做到这一点?

database-project visual-studio-2013 sql-server-2014

2
推荐指数
2
解决办法
2199
查看次数

只有SQL Server 2014中的分组后的不同值

以下是数据示例:

 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 sql-server group-by distinct sql-server-2014

2
推荐指数
1
解决办法
473
查看次数

SQL Server 2014 Service Broker不会激活从队列接收消息的过程

这种情况与SQL Service Broker密切相关- 通信场景 - 从SQL 2008 R2迁移到SQL 2014SQL 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

sql-server service-broker sql-server-2014

2
推荐指数
1
解决办法
1847
查看次数

如果发生错误,是否会回滚此事务

我有一个我想提交的事务,但不确定是否会在任何失败时回滚.我知道我可以在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)

sql sql-server sql-server-2014

2
推荐指数
1
解决办法
129
查看次数

带有列号的SQL循环

我有一张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给出行返回的数量.

sql sql-server sql-server-2014

2
推荐指数
1
解决办法
81
查看次数

如何使用具有OR子句的COALESCE创建动态WHERE

我一直使用动态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书籍和在线,但是找不到任何可以匹配这种情况的东西.

sql sql-server sql-server-2014

2
推荐指数
1
解决办法
142
查看次数

如何解决SQL Server错误"在预期条件的上下文中指定的非布尔类型的表达式,靠近'GROUP'"

这是我的查询

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

2
推荐指数
1
解决办法
3万
查看次数

如何将SQL查询结果转换为具有属性的html标记

请考虑下表在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)

html xml t-sql sql-server sql-server-2014

2
推荐指数
1
解决办法
358
查看次数