小编Bog*_*ean的帖子

何时/什么锁在READ COMMITTED隔离级别中保持/释放

我试图了解SQL Server中的隔离/锁定.

我在READ COMMITTED隔离级别中有以下场景(默认)

我们有一张桌子.

create table Transactions(Tid int,amt int)

with some records

insert into Transactions values(1, 100)
insert into Transactions values(2, -50)
insert into Transactions values(3, 100)
insert into Transactions values(4, -100)
insert into Transactions values(5, 200)
Run Code Online (Sandbox Code Playgroud)

现在从msdn我明白了

当选择被触发时,共享锁被占用,因此没有其他事务可以修改数据(避免脏读).文档还讨论了行级,页级,表级锁.我想到了下面的观点

Begin Transaction

select * from Transactions

/*
some buisness logic which takes 5 minutes

*/

Commit
Run Code Online (Sandbox Code Playgroud)

我想要了解的是获取共享锁的持续时间以及(行,页,表).

只有在语句select * from Transactions运行时才会获取锁定,或者在我们达到COMMIT之前将整个5分钟获取锁定.

t-sql sql-server locking isolation-level

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

Postgres从左连接更新

我是PostgreSQL的新手,试图从SQL Server转换查询.

我有一个表用户,其中包括列bUsrActive,bUsrAdmin和sUsrClientCode.我想更新用户并设置bUsrActive = false如果不存在具有相同sUsrClientCode的另一个用户,其中bUsrAdmin = true且bUsrActive = true.

在SQL Server中,我有这个查询

UPDATE u SET u.bUsrActive = 0
FROM Users u
LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = 1 AND u2.bUsrActive = 1
WHERE u.bUsrAdmin = 0 AND u.bUsrActive = 1 AND u2.nkUsr IS NULL
Run Code Online (Sandbox Code Playgroud)

我正在尝试将其转换为postgres.我写了3种方法.

1)我的第一次尝试.显然不行.

UPDATE Users u
    SET bUsrActive = false
FROM Users u2
WHERE u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = true AND u2.bUsrActive = true
AND u.bUsrAdmin = false AND u.bUsrActive = true …
Run Code Online (Sandbox Code Playgroud)

sql sql-server postgresql sql-update

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

Unicode SQL查询W /参数而不是N前缀

我有一个插入查询,可以在C#中针对SQL Server数据库执行.

我插入的列是nvarchar类型.

我插入该列的数据是非英语的.

我是否足以使用AddWithValue将非英语数据传递给服务器?像这样的例子:

string dogName = "?????";
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand("INSERT INTO Dogs1(Name) VALUES @Name", connection))
    {
    command.Parameters.AddWithValue("Name", dogName);
    command.ExecuteNonQuery();
    }
}
Run Code Online (Sandbox Code Playgroud)

或者我必须使用N前缀来声明它是unicode吗?就像它在这里说的那样.

c# sql sql-server unicode

9
推荐指数
1
解决办法
4627
查看次数

如何创建仅获取已在表中更新的数据的查询

我不知道从哪里开始或者这将如何工作,我希望有人有一个想法或一个经过验证的方法.

为了展示我想要做的事情的一个例子,我创建了一个存储过程,它通过从链接表中获取记录来更新或插入Local表中的新记录.存储过程在SQL Server中作为作业运行,以更新和插入新记录.

我的问题是:有没有办法查询本地表中的数据,以便最初我可以获取所有记录,但只获取已插入的新记录或更新的旧记录?

我不想连续获取所有记录,只添加新记录或更新记录.

这可能吗?

以下是我创建的存储过程,作为更新本地电话数据的示例:

CREATE PROCEDURE sp_UPDATE_PHONE_RECORDS
AS 
BEGIN
MERGE dbo.PHONE_REC AS Target
USING (SELECT MEMBER_ID 
      ,HOME_PHONE = dbo.udf_StdPhoneFmt(HOME)
      ,CELL_PHONE = dbo.udf_StdPhoneFmt(CELL)
      ,WORK_PHONE = dbo.udf_StdPhoneFmt(WORK)

FROM PHONE WHERE MEMBER_ID IS NOT NULL) AS SOURCE

ON (Target.MEMBER_ID = SOURCE.MEMBER_ID)

WHEN MATCHED THEN

    UPDATE SET Target.HOME_PHONE = Source.HOME_PHONE,Target.CELL_PHONE = Source.CELL_PHONE,
    Target.WORK_PHONE = Source.WORK_PHONE

WHEN NOT MATCHED BY TARGET THEN
    INSERT (MEMBER_ID, HOME_PHONE, CELL_PHONE ,WORK_PHONE)

    VALUES (Source.MEMBER_ID, Source.HOME_PHONE, Source.CELL_PHONE, Source.WORK_PHONE);
END
GO
Run Code Online (Sandbox Code Playgroud)

这可能吗?

感谢大家!

sql t-sql sql-server sql-server-2008

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

什么类型的数据类型用于年和月?

我必须在我的表中存储年份和月份以及下个月的另外两列主题和主题详细信息我data type应该使用什么

我应该smalldatetime通过制作日期来使用和存储它们09/01/2011吗?

我应该使用两列varcharint分别存储年份和月份2011 09吗?

我应该使用一个列varchar来存储它们,如何连接它们201109

EDITED

有一件事我还想补充一点,我必须在搜索中使用这些列,所以我必须在where子句中使用它们所以在回答这个事情也很重要

sql sql-server sql-server-2005

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

T-SQL CTE实现技术不适用于SQL Server 2012

我必须使用以下技术来实现我的CTE并提高视图性能:

WITH CTE AS(
    SELECT TOP 100 PERCENT
    ORDER BY ...
)

WITH CTE AS(
    SELECT TOP 2147483647
    ORDER BY ...
)
Run Code Online (Sandbox Code Playgroud)

现在,这两种方式都不起作用.有没有人面临同样的问题或知道在SQL Server 2012中这个东西是无效的?

t-sql sql-server materialized common-table-expression sql-server-2012

6
推荐指数
1
解决办法
3486
查看次数

如何将二进制数据转换为文本数据?

如何将二进制数据转换为文本?

我在测试表中有名为“文件名”的列,具有图像数据类型,因此当我从测试表中选择数据时,它显示的文件名列的数据是二进制数据,即(“0x433A5C55736535”)。

问候安吉

sql-server sql-server-2005

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

我可以多次迭代更新单个列 - 在一个语句中吗?

我有一个表,我在我的存储过程中作为表类型参数接收(它来自excel工作簿源,但这是一个不同的故事).它有几列我需要根据每列的有效值列表验证值.

假设我的表OriginDetails看起来像这样(请注意,这只是模拟数据;我有两个这样的表,每个8列我将验证) -

Origin   | Status     | Priority | ErrMsg
------------------------------------------
Testing  | In Review  | Low      | 
Design   | Initiated  | Medium   | 
Prod     | Declined   | Critical |           
Run Code Online (Sandbox Code Playgroud)

而且,我在列验证值Origin,StatusPriority针对三种不同的列表(其实我对验证数据的值表,但为了简单起见,我硬编码在这里这些值),并更新ErrMsg基于我验证列-

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Invalid Origin' 
WHERE Origin NOT IN ('Pre-Design','Design','Development') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Unrecognized Status' 
WHERE Status NOT IN ('In Review','Approved') 

UPDATE OriginDetails 
SET ErrMsg = ErrMsg + '|Priority check failed' …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2008

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

跟踪MSSQL 2008表的变化,最好的方法是什么?

我需要跟踪.NET 4.0应用程序中一个MSSQL表中的记录更改.这样做的最佳方法是什么?

有关该应用程序的更多说明 我们有会员表,从应用程序#1更新.我们还开发了应用程序#2,它应该跟踪成员资格表并发送有关某些成员资格数据更改的电子邮件通知.

c# sql-server monitoring sql-server-2008

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

WITH语句是每个查询执行一次还是每行执行一次?

我对WITH语句(CTE)的理解是每个查询执行一次.使用这样的查询:

WITH Query1 AS ( ... )
SELECT *
FROM
    SomeTable t1
    LEFT JOIN Query1 t2 ON ...
Run Code Online (Sandbox Code Playgroud)

如果这导致100行,我希望Query1它只执行一次 - 而不是100次.如果这个假设是正确的,运行整个查询所需的时间大致等于带到时间:跑Query1+选择SomeTable+加入SomeTableQuery1.

我处于以下情况:

  • Query1 单独运行需要约5秒(400k行).
  • 删除WITH语句后,查询的其余部分LEFT JOIN需要~15秒(400k行).

因此,当使用WITH语句和LEFT JOIN就地运行整个查询时,我会期望查询及时完成,而我让它运行超过一个小时,一旦停止它只能达到11k行.

我显然是错的,但为什么呢?

sql-server performance with-statement common-table-expression sql-server-2008

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

SQL 不会根据确切日期提取记录

我导出了记录,我想知道在特定日期导出了哪条记录。这是行不通的。如果我查询它,这是数据。

* comapny Name *     * date exported *
ABC Company, Inc    2011-08-01 15:44:52.857
XYZ Company, Inc    2011-08-01 15:44:52.857
Run Code Online (Sandbox Code Playgroud)

我发出此命令,它不会检索精确匹配项

select companyname, exporteddate from mytable exporteddate = '2011-08-01' <- does not work
select companyname, exporteddate from mytable exporteddate like '%2011-08-01%' <-- tried this variation too and many other, did not work
Run Code Online (Sandbox Code Playgroud)

有趣的是 >=, >, <= 有效。真正的问题是什么?导出的日期声明为日期时间字段。

select companyname, exporteddate from mytable exporteddate >= '2011-08-01' <- this works
Run Code Online (Sandbox Code Playgroud)

我使用的是 Windows XP、MS-SQL 2005 SP3(不完全但接近)。

sql sql-server sql-server-2005 date exact-match

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

找出列是否有varchar 20

目标:
找出列名Firstname是否有varchar(20).如果是,请更改表等.

问题:
我有问题要查明列名是否包含varchar 20(如果存在)所有内容都发生在SQL Server 2008 R2中

表职员
栏目:

Firstname varchar(20)  
Lastname varchar(100)
if Exists()   // Find out if column Firstname has varchar(20)
begin 

   // Alter table and its specific column

end 
Run Code Online (Sandbox Code Playgroud)

sql sql-server alter sql-server-2008

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

更好的SQL分页技术

有没有更好的方法在SQL服务器中进行分页?

例如,我必须使用以下技术将@skip添加到@take:

;WITH tmp_cte AS (
 SELECT ROW_NUMBER() OVER (ORDER BY LastName) AS RowNumber,
        LastName, 
        FirstName
   FROM person.Person
  WHERE FirstName like '%ad%'
)
SELECT * 
FROM tmp_cte 
WHERE RowNumber > @skip --10 
AND RowNumber <= @Take--20
Run Code Online (Sandbox Code Playgroud)

是否有更好的方法,以便我不必添加跳过?

sql sql-server sql-server-2012

0
推荐指数
1
解决办法
110
查看次数