我们的系统在SQL Server 2000上运行,我们正在准备升级到SQL Server 2008.我们有很多触发器代码,我们需要检测给定列中的更改,然后对该列进行操作已经改变.
显然,SQL Server提供了UPDATE()和COLUMNS_UPDATED()函数,但这些函数只告诉您SQL语句中涉及哪些列,而不是实际更改了哪些列.
要确定哪些列已更改,您需要类似于以下代码(对于支持NULL的列):
IF UPDATE(Col1)
SELECT @col1_changed = COUNT(*)
FROM Inserted i
INNER JOIN Deleted d ON i.Table_ID = d.Table_ID
WHERE ISNULL(i.Col1, '<unique null value>')
!= ISNULL(i.Col1, '<unique null value>')
Run Code Online (Sandbox Code Playgroud)
对于您有兴趣测试的每个列,都需要重复此代码.然后,您可以检查"已更改"值以确定是否执行昂贵的操作.当然,这段代码本身也存在问题,因为它只告诉您列中的至少一个值已经修改了所有行.
您可以使用以下内容测试单个UPDATE语句:
UPDATE Table SET Col1 = CASE WHEN i.Col1 = d.Col1
THEN Col1
ELSE dbo.fnTransform(Col1) END
FROM Inserted i
INNER JOIN Deleted d ON i.Table_ID = d.Table_ID
Run Code Online (Sandbox Code Playgroud)
...但是当您需要调用存储过程时,这不起作用.在这些情况下,就我所知,你必须依靠其他方法.
我的问题是,是否有人有关于在触发器中预测数据库操作的问题的最佳/最便宜的方法是什么最好/最便宜的方法是关于修改行中的特定列值是否实际已经改变或者不.上述两种方法都不合理,我想知道是否存在更好的方法.
t-sql sql-server performance sql-server-2000 sql-server-2008
如何在Managed C++中编写以下C#代码
void Foo()
{
using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
{
//do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
Clarificaton: 对于托管对象.
在关系数据库中保存复合模式的"最佳实践"是什么?
我们一直在使用Modified Preorder Tree Traversal.这可以非常快速地构建整个树,但插入或删除新节点的速度非常慢(需要调整所有左右值).查询节点的子节点也不容易且非常慢.
我们注意到的另一件事是你必须确保树不会变得混乱.您需要事务锁定,否则左侧和右侧值可能会损坏,修复损坏的左侧树不是一件容易的事.
它确实工作得非常好,修改后的预订树遍历,但我想知道是否有更好的选择.
我确实使用该findcontours()方法从图像中提取轮廓,但我不知道如何从一组轮廓点计算曲率.有人能帮助我吗?非常感谢你!
谁能解释编译是如何工作的?
我似乎无法弄清楚编译是如何工作的..
更具体地说,这是一个例子..我正在尝试在MSVC++ 6中编写一些代码来加载Lua状态.
我已经:
但是我仍然在MSVC++ 6中遇到一些关于未解析的外部符号的错误(对于我使用的Lua函数).
尽管我想知道如何解决这个问题并继续前进,但我认为如果我了解所涉及的基础过程对我来说会好得多,所以有人可能会为此写一个很好的解释吗?我想知道的是这个过程..它看起来像这样:
步骤1:
第2步:
等等..
谢谢..
也许这将解释什么是符号,究竟什么是"链接",什么是"对象"代码或者其他什么.
谢谢..抱歉这样的菜鸟..
PS这不一定是语言特定的..但随意用你最舒服的语言表达它.. :)
编辑:所以无论如何,我能够解决错误,事实证明我必须手动将.lib文件添加到项目中; 只需在IDE设置或项目设置中指定库目录(.lib所在的位置)不起作用..
但是,下面的答案在一定程度上帮助我更好地理解了这个过程.非常感谢!如果有人还想写一篇详尽的指南,请做.. :)
编辑:仅供参考,我发现一篇作者(Mike Diehl)的两篇文章很好地解释了这一点.:) 检查编译过程:第1部分 检查编译过程:第2部分
概述:
我有三个表1)订阅者,bios和衬衫,我需要找到没有生物或衬衫的订户
桌子的布局如
用户
| season_id | user_id |
Run Code Online (Sandbox Code Playgroud)
生物
| bio_id | user_id |
Run Code Online (Sandbox Code Playgroud)
衬衫尺码
| bio_id | shirtsize |
Run Code Online (Sandbox Code Playgroud)
而且我需要找到所有没有生物或衬衫尺码的用户(如果没有生物;那么通过关系没有衬衫尺寸)对于任何给定的季节.
我最初写了一个像这样的查询:
SELECT *
FROM subscribers s
LEFT JOIN bio b ON b.user_id = subscribers.user_id
LEFT JOIN shirtsizes ON shirtsize.bio_id = bio.bio_id
WHERE s.season_id = 185181 AND (bio.bio_id IS NULL OR shirtsize.size IS NULL);
Run Code Online (Sandbox Code Playgroud)
但现在需要10秒钟才能完成.
我想知道如何重构查询(或可能是问题),以便它可以合理地进行预编码.
这是mysql解释:( ogu = subscriber,b = bio,tn = shirtshize)
| id | select_type | table | type | possible_keys | key | key_len | …Run Code Online (Sandbox Code Playgroud) 我在C++中有一个double值的排序数组.是否有一个STL函数将返回索引中的最近的数组中值与给定值的两倍?
例如,给定以下数组
double myarray[5] = { 1.0, 1.2, 1.4. 1.5, 1.9 };
Run Code Online (Sandbox Code Playgroud)
函数调用
search(myarray, 1.6);
Run Code Online (Sandbox Code Playgroud)
应该返回3,最接近1.6的元素的索引,而不是-1(或一些其他标志值),表示未找到值1.6.
SQL中加入char(或varchar)值的表是否有任何性能缺陷,而不是加入整数值?
我试图添加一个列(MSSQL 2005)到一个表(Employee)与默认约束的另一个表(Department)的主键.然后我将把这个列作为该表的FK.基本上,如果没有提供DepartmentID,这将根据部门名称将新员工分配给基础部门.
这不起作用:
DECLARE @ErrorVar INT
DECLARE @DepartmentID INT
SELECT @DepartmentID = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
ALTER TABLE [Employee]
ADD [DepartmentID] INT NULL
CONSTRAINT [DepartmentIDOfAssociate] DEFAULT (@DepartmentIDAssociate)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
GOTO FATAL_EXIT
END
Run Code Online (Sandbox Code Playgroud)
生产,测试和开发数据库已经变得不同步,DepartmentName ='RocketScience'的DepartmentID可能相同或不同,所以我不想只说DEFAULT(somenumber).无论我采用哪种方式攻击问题,我都会继续"在ALTER TABLE语句中不允许使用变量".
这样做的正确方法是什么?我已经尝试嵌套select语句,它获得"在此上下文中不允许子查询.只允许使用标量表达式."
另外,我可以在一个语句中填充列值而不是执行
{ALTER null}
{Update values}
{ALTER not null}
步骤.我读了一些有关WITH VALUES命令的内容,但无法使其工作.谢谢!!!
我需要做这样的事情
class User < ActiveRecord::Base
has_many :abuse_reports
end
class AbuseReport < ActiveRecord::Base
belongs_to :abuser, :class_name => 'User', :foreign_key => 'abuser_id'
belongs_to :game
end
class Game < ActiveRecord::Base
has_many :abuse_reports
end
@top_abusers = User.page(params[:page],
:joins => [
'JOIN abuse_reports ON users.id = abuse_reports.abuser_id',
'JOIN games ON games.id = abuse_reports.game_id'
],
:group => 'users.id',
:select => 'users.*, count(distinct games.id) AS game_count, count(abuse_reports.id) as abuse_report_count',
:order => 'game_count DESC, abuse_report_count DESC'
)
Run Code Online (Sandbox Code Playgroud)
这可行,但不会为AbuseReports或Games创建对象 - 它只返回一堆行.当我从视图中引用这些对象时,它会再次加载它们.有没有办法来解决这个问题?或者某种方式来获得这种行为而不使用:join?
join ×3
c++ ×2
sql ×2
sql-server ×2
t-sql ×2
.net ×1
activerecord ×1
alter-table ×1
database ×1
default ×1
lua ×1
managed-c++ ×1
opencv ×1
optimization ×1
performance ×1
ruby ×1
search ×1
stl ×1
visual-c++ ×1
visual-c++-6 ×1