我试图了解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分钟获取锁定.
我是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) 我有一个插入查询,可以在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吗?就像它在这里说的那样.
我不知道从哪里开始或者这将如何工作,我希望有人有一个想法或一个经过验证的方法.
为了展示我想要做的事情的一个例子,我创建了一个存储过程,它通过从链接表中获取记录来更新或插入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)
这可能吗?
感谢大家!
我必须在我的表中存储年份和月份以及下个月的另外两列主题和主题详细信息我data type
应该使用什么
我应该smalldatetime
通过制作日期来使用和存储它们09/01/2011
吗?
我应该使用两列varchar
或int
分别存储年份和月份2011
09
吗?
我应该使用一个列varchar
来存储它们,如何连接它们201109
?
EDITED
有一件事我还想补充一点,我必须在搜索中使用这些列,所以我必须在where子句中使用它们所以在回答这个事情也很重要
我必须使用以下技术来实现我的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
如何将二进制数据转换为文本?
我在测试表中有名为“文件名”的列,具有图像数据类型,因此当我从测试表中选择数据时,它显示的文件名列的数据是二进制数据,即(“0x433A5C55736535”)。
问候安吉
我有一个表,我在我的存储过程中作为表类型参数接收(它来自excel工作簿源,但这是一个不同的故事).它有几列我需要根据每列的有效值列表验证值.
假设我的表OriginDetails
看起来像这样(请注意,这只是模拟数据;我有两个这样的表,每个8列我将验证) -
Origin | Status | Priority | ErrMsg
------------------------------------------
Testing | In Review | Low |
Design | Initiated | Medium |
Prod | Declined | Critical |
Run Code Online (Sandbox Code Playgroud)
而且,我在列验证值Origin
,Status
并Priority
针对三种不同的列表(其实我对验证数据的值表,但为了简单起见,我硬编码在这里这些值),并更新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) 我需要跟踪.NET 4.0应用程序中一个MSSQL表中的记录更改.这样做的最佳方法是什么?
有关该应用程序的更多说明 我们有会员表,从应用程序#1更新.我们还开发了应用程序#2,它应该跟踪成员资格表并发送有关某些成员资格数据更改的电子邮件通知.
我对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
+加入SomeTable
到Query1
.
我处于以下情况:
Query1
单独运行需要约5秒(400k行).WITH
语句后,查询的其余部分LEFT JOIN
需要~15秒(400k行).因此,当使用WITH
语句和LEFT JOIN
就地运行整个查询时,我会期望查询及时完成,而我让它运行超过一个小时,一旦停止它只能达到11k行.
我显然是错的,但为什么呢?
sql-server performance with-statement common-table-expression sql-server-2008
我导出了记录,我想知道在特定日期导出了哪条记录。这是行不通的。如果我查询它,这是数据。
* 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(不完全但接近)。
目标:
找出列名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服务器中进行分页?
例如,我必须使用以下技术将@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-server ×13
sql ×8
t-sql ×4
c# ×2
alter ×1
date ×1
exact-match ×1
locking ×1
materialized ×1
monitoring ×1
performance ×1
postgresql ×1
sql-update ×1
unicode ×1