正如先前的Stack Overflow问题(TransactionScope和连接池以及SqlConnection如何管理IsolationLevel?)所证明的那样,事务隔离级别在SQL Server和ADO.NET(也是System.Transactions和EF)的池化连接中泄漏,因为它们建立在ADO.NET).
这意味着,在任何应用程序中都可能发生以下危险事件序列:
问题:防止这种情况的最佳方法是什么?现在到处都需要使用显式交易吗?
这是一个独立的复制品.您将看到第三个查询将继承第二个查询中的Serializable级别.
class Program
{
static void Main(string[] args)
{
RunTest(null);
RunTest(IsolationLevel.Serializable);
RunTest(null);
Console.ReadKey();
}
static void RunTest(IsolationLevel? isolationLevel)
{
using (var tran = isolationLevel == null ? null : new TransactionScope(0, new TransactionOptions() { IsolationLevel = isolationLevel.Value }))
using (var conn = new SqlConnection("Data Source=(local); Integrated Security=true; Initial Catalog=master;"))
{
conn.Open();
var cmd = new SqlCommand(@"
select
case transaction_isolation_level
WHEN 0 THEN 'Unspecified'
WHEN 1 THEN …Run Code Online (Sandbox Code Playgroud) 当我在我的数据库中搜索时,如果我发现某个特定项目不存在,我会运行一个INSERT语句,如果找到一个或多个这个项目,我会运行一个不同的INSERT语句.
我不完全确定如何使用IF ELSE表达式.
到目前为止,我所做的是一份声明,它将计算目标数据出现的次数; 如果它大于0,它将打印为TRUE,否则,它将打印为FALSE.我找不到任何示例来帮助我理解如何使用它来运行两个不同的INSERT语句.
这是我到目前为止:
SELECT CASE WHEN COUNT(*)>0 THEN 'TRUE' ELSE 'FALSE' END
(
SELECT [Some Column], COUNT(*) TotalCount
FROM INCIDENTS
WHERE [Some Column] = 'Target Data'
GROUP BY [Some Column]
)
Run Code Online (Sandbox Code Playgroud) 根据BOL(SQL Server Books Online)sp_dbcmptlevel,
将在Microsoft SQL Server的未来版本中删除此功能.请勿在新的开发工作中使用此功能,并尽快修改当前使用此功能的应用程序.请改用ALTER DATABASE兼容级别.
现在,我知道检查数据库兼容性的唯一TSQL方式是通过sp_dbcmptlevel.据我所知,ALTER DATABASE Compatibility Level仅用于设置兼容级别,而不是获取信息.
如何在不使用GUI的情况下获得兼容级别?
Microsoft SQL Server T-SQL中是否有命令告诉脚本停止处理?我有一个脚本,我想保留用于存档目的,但我不希望任何人运行它.
如何使用SQL Server返回包含非ASCII字符的行?
如果你能展示如何为一个列做这件事会很棒.
我现在正在做这样的事情,但它没有用
select *
from Staging.APARMRE1 as ar
where ar.Line like '%[^!-~ ]%'
Run Code Online (Sandbox Code Playgroud)
对于额外的功劳,如果它可以跨越表中的所有 varchar列,那将是非常出色的!在这个解决方案中,返回三列是很好的:
Id | FieldName | InvalidText |
----+-----------+-------------------+
25 | LastName | Solís |
56 | FirstName | François |
100 | Address1 | 123 Ümlaut street |
Run Code Online (Sandbox Code Playgroud)
无效字符可以是SPACE(32 10)到~(127 10)范围之外的任何字符
我有一个名为的表countries,我country_name通过在SQL Server 2008 R2上创建"唯一键"类型的"索引/键"来定义列是唯一的.
但我有以下问题:
IsUnique值保持为"是",那么会有任何差异吗?我有一个整数列"月"我希望得到一个月的2位数.
这就是我的尝试:DATEPART(mm,@ Date)
它返回1月到9月的一个数字我正在使用SQL Server 2008
有人有建议吗?
这更像是一个语法问题,我正在尝试编写一个可以嵌入到查询中的存储过程或函数,例如:
select * from MyBigProcOrFunction
Run Code Online (Sandbox Code Playgroud)
我正在尝试定义一个表格函数,但我不明白如何做到这一点,因为我构建tmp表来计算数据,然后我终于在endtable返回了.我的代码标记是:
create function FnGetCompanyIdWithCategories()
returns table
as
return
(
select * into a #tempTable from stuff
'
etc
'
select companyid,Company_MarketSector from #tempTables 'the returning table data
)
Run Code Online (Sandbox Code Playgroud)
如果我定义一个函数,我该如何将它作为表格返回?
假设我的表结构看起来像这样:
CREATE TABLE [dbo].[table1] (
[id] [int] IDENTITY(1,1) NOT NULL,
[data] [varchar](255) NOT NULL,
CONSTRAINT [PK_table1] PRIMARY KEY CLUSTERED ([id] ASC)
)
CREATE TABLE [dbo].[table2] (
[id] [int] IDENTITY(1,1) NOT NULL,
[table1_id] [int] NOT NULL,
[data] [varchar](255) NOT NULL,
CONSTRAINT [PK_table2] PRIMARY KEY CLUSTERED ([id] ASC)
)
Run Code Online (Sandbox Code Playgroud)
第[id]一个表的[table1_id]字段对应于第二个字段的字段.我想要做的是在单个事务中将数据插入到两个表中.现在我已经知道如何通过执行INSERT-SELECT-INSERT来做到这一点,如下所示:
BEGIN TRANSACTION;
DECLARE @id [int];
INSERT INTO [table1] ([data]) VALUES ('row 1');
SELECT @id = SCOPE_IDENTITY();
INSERT INTO [table2] ([table1_id], [data]) VALUES (@id, 'more of row 1');
COMMIT …Run Code Online (Sandbox Code Playgroud) 我用SQL Server 2008 R2.
我需要按两列的最小值对表进行排序.
该表如下所示:
ID: integer;
Date1: datetime;
Date2: datetime.
Run Code Online (Sandbox Code Playgroud)
我希望我的数据按最少两个日期排序.
以这种方式对此表进行排序的最简单方法是什么?
sql-server ×10
t-sql ×10
sql ×6
ado.net ×1
foreign-keys ×1
insert ×1
min ×1
sorting ×1
sql-scripts ×1
transactions ×1