很久以前我只使用SQL2k5,但最近更新到了2008 R2.除了Mgmt Studio的明显变化之外,有一个怪癖开始变得非常烦人:每次连接被丢弃时,我都必须再次切换回'丢失'数据库,因为似乎连接自动重新连接到初始数据库再次.
在SQL 2005中,我只需要按F5两次,第一次它会给我一个错误,说连接丢失,第二次重新连接到它在连接被删除之前所在的数据库然后执行任何sql-commands它有过.我是如何通过使用顶部的下拉框或USE声明来获取该数据库并不重要的......
在SQL 2008(R2)中,我现在按F5,mgmt studio将静默"吃掉"丢失的连接,而是立即重新连接到服务器,并在使用[>连接时执行默认数据库或我强制'的数据库上的代码>选项]按钮/标签
这种情况发生了很多,因为我经常打开一个选项卡来杀死所有连接并恢复数据库,另一个(系列)选项卡包含已更改的程序,测试用例等...
是否有一些(隐藏)配置(重新)设置此行为?我知道我可以尝试在任何地方添加USE语句,或者"强制"将每个连接直接添加到它的"目标"数据库,但是再见特别查询然后=(
ps:做一些额外的搜索我想知道这是不是因为这里的"修复"直言不讳 [connect.com]
ps:作为附注,在重新连接屏幕底部的SPID之后也没有正确更新,因此我已经杀死了错误的连接,因为我基于过时的信息... yay for progress = ((**)
谁比我更好的谷歌?或者与微软的关系更密切?=)
谢谢.
(**:伙计,我很想念查询分析器=)
背景:我试图在创建虚拟数据时获得一些随机的"十六进制"值,并提出了这种结构:
SELECT TOP 100
result = (CASE ABS(Binary_Checksum(NewID())) % 16
WHEN -1 THEN 'hello'
WHEN 0 THEN '0'
WHEN 1 THEN '1'
WHEN 2 THEN '2'
WHEN 3 THEN '3'
WHEN 4 THEN '4'
WHEN 5 THEN '5'
WHEN 6 THEN '6'
WHEN 7 THEN '7'
WHEN 8 THEN '8'
WHEN 9 THEN '9'
WHEN 10 THEN 'a'
WHEN 11 THEN 'b'
WHEN 12 THEN 'c'
WHEN 13 THEN 'd'
WHEN 14 THEN 'e'
WHEN 15 THEN 'f'
ELSE 'huh' …Run Code Online (Sandbox Code Playgroud) 浏览SO时,我发现了以下关于插入尚不存在的记录的"最佳"方法的问题/讨论.让我印象深刻的一句话是[Remus Rusanu]陈述的一句话:
两种变体都不正确.您将插入一对重复的@ value1,@ value2,保证.
虽然我确实同意检查与INSERT"分离"的语法(并且不存在显式锁定/事务管理); 我很难理解为什么以及何时这对于其他提出的语法来说是正确的
INSERT INTO mytable (x)
SELECT @x WHERE NOT EXISTS (SELECT * FROM mytable WHERE x = @x);
Run Code Online (Sandbox Code Playgroud)
我不想开始(另一个)什么是最好/最快的讨论,我也不认为语法可以'替换'一个独特的索引/约束(或PK)但我真的需要知道在什么情况下这个结构可能导致双倍,因为我过去一直在使用这种语法,并想知道将来继续这样做是不安全的.
我认为发生的是INSERT和SELECT都在同一(隐式)事务中.查询将对相关记录(密钥)进行IX锁定,并且在整个查询完成之前不会释放它,因此仅在插入记录之后.这个锁阻止所有其他连接进行相同的INSERT,因为它们不能自己锁定,直到我们的插入完成之后; 只有这样他们才能获得锁定并且如果记录已经存在则将开始自己验证.
作为恕我直言,找出答案的最佳方法是通过测试,我已经在笔记本电脑上运行了以下代码:
创建表格
CREATE TABLE t_test (x int NOT NULL PRIMARY KEY (x))
Run Code Online (Sandbox Code Playgroud)
在许多很多连接并行运行下面)
SET NOCOUNT ON
WHILE 1 = 1
BEGIN
INSERT t_test (x)
SELECT x = DatePart(ms, CURRENT_TIMESTAMP)
WHERE NOT EXISTS ( SELECT *
FROM t_test old
WHERE old.x = DatePart(ms, CURRENT_TIMESTAMP) )
END
Run Code Online (Sandbox Code Playgroud)
到目前为止,唯一需要注意的事项是:
更新:
结果我上面的例子没有按照我的意图去做.我没有尝试同时插入相同记录的多个连接,而是在第一秒之后没有插入已存在的记录.由于在下一次连接上复制粘贴并执行查询可能需要大约一秒钟,因此从不存在重复的危险.我将在今天余下的时间里戴着我的驴耳...... …
看来我正在用'我最喜欢的数据类型'SqlDecimal遇到更多困境.我想知道这是否应该被认为是一个错误.
当我在SQL中乘以两个小数字时,我得到了预期的结果.当我通过SQLCLR函数运行相同的数字时,结果非常令人惊讶.
c#代码:
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace TestMultiplySQLDecimal
{
public static class Multiplier
{
[SqlFunction(DataAccess=DataAccessKind.None, IsDeterministic = true,IsPrecise = true)]
public static SqlDecimal Multiply(SqlDecimal a, SqlDecimal b)
{
if (a.IsNull || b.IsNull) return SqlDecimal.Null;
return a*b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
SQL代码:
USE tempdb
GO
IF DB_ID('test') IS NOT NULL DROP DATABASE test
GO
CREATE DATABASE test
GO
USE test
GO
CREATE ASSEMBLY TestMultiplySQLDecimal
FROM 'C:\Users\tralalalaa\Documents\visual studio 2015\Projects\TestMultiplySQLDecimal\TestMultiplySQLDecimal\bin\Release\TestMultiplySQLDecimal.dll'
WITH PERMISSION_SET = SAFE
GO
CREATE FUNCTION dbo.fn_multiply(@a decimal(38,8), @b decimal(18,8)) …Run Code Online (Sandbox Code Playgroud) 我似乎在如何最好地解决这一要求方面遇到了一些困境.我意识到这个问题与以下其他问题密切相关:
增加的问题是,我想知道如何解决问题的一般意见.
IF OBJECT_ID('tempdb..#A') IS NOT NULL DROP TABLE #A
IF OBJECT_ID('tempdb..#B') IS NOT NULL DROP TABLE #B
GO
CREATE TABLE #A (key1 int NOT NULL PRIMARY KEY,
value1 int NOT NULL,
value2 int NOT NULL,
is_even AS (CASE WHEN key1 % 2 = 0 THEN 1 ELSE 0 END))
CREATE TABLE #B (key1 int NOT NULL PRIMARY KEY,
value1 int NOT NULL,
value2 int NOT NULL,
is_even AS (CASE WHEN key1 % 2 …Run Code Online (Sandbox Code Playgroud) 不熟悉c#我在不同线程之间传递SqlDataReader时遇到了这个"难题".在没有太多细节的情况下,我们的想法是让一个主线程从数据库中获取数据(一个大的记录集),然后让一个帮助程序任务按记录运行这个记录并根据这个内容做一些事情.没有对记录集的反馈,它只是等待直到没有记录.这工作正常,但考虑到手头工作的性质,应该可以将这个工作分布在不同的线程(CPU)上以最大化吞吐量(执行顺序没有意义).那么问题就变成了,当我在SqlDataReader中传递这个记录集时,我是否必须使用ref?这有点归结为一个问题:如果我在没有指定ref的情况下传递对象,那么'赢了' 它在内存中创建新副本并处理n次记录?或者,我不是冒险将记录位置向前移动而不是所有字段都已完全读取了吗?后者似乎更像是一个"数据竞争"问题,可能是由lock()机制所覆盖(或不是?).
我对这个问题的初步看法是,它并没有真正伤害使用ref传递变量,但正如一位同事所说的那样:"当你做错事时你只需要参考"=)另外使用ref限制我应用一个使用()结构也不是很好.因此,我创建了一个"基本"项目,解决了相同的方法,但没有引用.到目前为止的测试表明,它使用任意数量的线程在Core2Duo(2cpu)上完美运行,但我仍然有点谨慎......你有什么专家对此的看法?是否使用ref?
你可以在这里找到测试项目,因为我似乎无法直接将它上传到这个问题?!?
ps:它只是一个测试项目而且我是c#的新手,所以在打破代码时请对我保持温和= P