标签: t-sql

SQL Server:池化连接中的隔离级别泄漏

正如先前的Stack Overflow问题(TransactionScope和连接池以及SqlConnection如何管理IsolationLevel?)所证明的那样,事务隔离级别在SQL Server和ADO.NET(也是System.Transactions和EF)的池化连接中泄漏,因为它们建立在ADO.NET).

这意味着,在任何应用程序中都可能发生以下危险事件序列:

  1. 发生请求,需要显式事务以确保数据一致性
  2. 任何其他请求都不会使用显式事务,因为它只进行非关键的读取.此请求现在将作为可序列化执行,可能导致危险的阻塞和死锁

问题:防止这种情况的最佳方法是什么?现在到处都需要使用显式交易吗?

这是一个独立的复制品.您将看到第三个查询将继承第二个查询中的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)

t-sql sql-server ado.net transactions transactionscope

53
推荐指数
3
解决办法
9465
查看次数

使用基于Count的IF ELSE语句来执行不同的Insert语句

当我在我的数据库中搜索时,如果我发现某个特定项目不存在,我会运行一个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)

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

53
推荐指数
4
解决办法
22万
查看次数

不推荐使用sp_dbcmptlevel后如何检查SQL Server数据库兼容性?

根据BOL(SQL Server Books Online)sp_dbcmptlevel,

将在Microsoft SQL Server的未来版本中删除此功能.请勿在新的开发工作中使用此功能,并尽快修改当前使用此功能的应用程序.请改用ALTER DATABASE兼容级别.

现在,我知道检查数据库兼容性的唯一TSQL方式是通过sp_dbcmptlevel.据我所知,ALTER DATABASE Compatibility Level仅用于设置兼容级别,而不是获取信息.

如何在不使用GUI的情况下获得兼容级别?

t-sql sql-server compatibility

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

SQL Server中的T-SQL STOP或ABORT命令

Microsoft SQL Server T-SQL中是否有命令告诉脚本停止处理?我有一个脚本,我想保留用于存档目的,但我不希望任何人运行它.

sql t-sql sql-server sql-scripts

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

使用SQL Server在varchar列中查找非ASCII字符

如何使用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)范围之外的任何字符

t-sql sql-server sql-server-2005 non-ascii-characters

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

SQL Server 2008上的唯一键与唯一索引

我有一个名为的表countries,我country_name通过在SQL Server 2008 R2上创建"唯一键"类型的"索引/键"来定义列是唯一的.

但我有以下问题:

  1. 将创建"唯一键"类型的"索引/键"自动在此列上创建非聚集索引?
  2. 如果我将类型从"唯一键"更改为"索引"并且我将IsUnique值保持为"是",那么会有任何差异吗?
  3. 那么为什么有两个选项"Unique Key"和"Index"我认为两者是一样的?

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

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

获得本月2位数字

我有一个整数列"月"我希望得到一个月的2位数.

这就是我的尝试:DATEPART(mm,@ Date)

它返回1月到9月的一个数字我正在使用SQL Server 2008

有人有建议吗?

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

52
推荐指数
5
解决办法
21万
查看次数

tsql从函数或存储过程返回一个表

这更像是一个语法问题,我正在尝试编写一个可以嵌入到查询中的存储过程或函数,例如:

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)

如果我定义一个函数,我该如何将它作为表格返回?

t-sql sql-server

51
推荐指数
3
解决办法
30万
查看次数

如何在SQL Server中同时将数据插入两个表?

假设我的表结构看起来像这样:

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 t-sql sql-server foreign-keys insert

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

按两列的最小值排序

我用SQL Server 2008 R2.

我需要按两列的最小值对表进行排序.

该表如下所示:

ID: integer; 
Date1: datetime; 
Date2: datetime.
Run Code Online (Sandbox Code Playgroud)

我希望我的数据按最少两个日期排序.

以这种方式对此表进行排序的最简单方法是什么?

sql t-sql sql-server sorting min

51
推荐指数
5
解决办法
4607
查看次数