小编mwi*_*ahl的帖子

检测MS SQL Server中列更改的最有效方法

我们的系统在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

24
推荐指数
4
解决办法
7万
查看次数

什么是与C#using语句等效的托管C++

如何在Managed C++中编写以下C#代码

void Foo()
{
    using (SqlConnection con = new SqlConnection("connectionStringGoesHere"))
    {
         //do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

Clarificaton: 对于托管对象.

.net managed-c++ using-statement

21
推荐指数
1
解决办法
2万
查看次数

在数据库中存储复合模式(分层数据)

在关系数据库中保存复合模式的"最佳实践"是什么?

我们一直在使用Modified Preorder Tree Traversal.这可以非常快速地构建整个树,但插入或删除新节点的速度非常慢(需要调整所有左右值).查询节点的子节点也不容易且非常慢.

我们注意到的另一件事是你必须确保树不会变得混乱.您需要事务锁定,否则左侧和右侧值可能会损坏,修复损坏的左侧树不是一件容易的事.

它确实工作得非常好,修改后的预订树遍历,但我想知道是否有更好的选择.

database modified-preorder-tree-t hierarchical-data

8
推荐指数
1
解决办法
5173
查看次数

如何通过opencv计算提取轮廓的曲率?

我确实使用该findcontours()方法从图像中提取轮廓,但我不知道如何从一组轮廓点计算曲率.有人能帮助我吗?非常感谢你!

c++ opencv

8
推荐指数
2
解决办法
5745
查看次数

编译过程

谁能解释编译是如何工作的?

我似乎无法弄清楚编译是如何工作的..

更具体地说,这是一个例子..我正在尝试在MSVC++ 6中编写一些代码来加载Lua状态.

我已经:

  • 设置库的其他目录并将文件包含到正确的目录中
  • 使用extern"C"(因为Lua只是C,所以我听说)
  • 包括正确的头文件

但是我仍然在MSVC++ 6中遇到一些关于未解析的外部符号的错误(对于我使用的Lua函数).

尽管我想知道如何解决这个问题并继续前进,但我认为如果我了解所涉及的基础过程对我来说会好得多,所以有人可能会为此写一个很好的解释吗?我想知道的是这个过程..它看起来像这样:

步骤1:

  • 输入:源代码
  • 过程:解析(可能在这里添加更多细节)
  • 输出:这里输出的是什么..

第2步:

  • 输入:无论从步骤1输出什么,加上可能还需要其他任何东西(库?DLL?.so?.lib?)
  • 过程:无论输入做什么
  • 输出:无论输出是什么

等等..

谢谢..

也许这将解释什么是符号,究竟什么是"链接",什么是"对象"代码或者其他什么.

谢谢..抱歉这样的菜鸟..

PS这不一定是语言特定的..但随意用你最舒服的语言表达它.. :)

编辑:所以无论如何,我能够解决错误,事实证明我必须手动将.lib文件添加到项目中; 只需在IDE设置或项目设置中指定库目录(.lib所在的位置)不起作用..

但是,下面的答案在一定程度上帮助我更好地理解了这个过程.非常感谢!如果有人还想写一篇详尽的指南,请做.. :)

编辑:仅供参考,我发现一篇作者(Mike Diehl)的两篇文章很好地解释了这一点.:) 检查编译过程:第1部分 检查编译过程:第2部分

compiler-construction lua visual-c++-6 visual-c++

7
推荐指数
2
解决办法
2529
查看次数

左联盟是我想要的,但他们很慢?

概述:

我有三个表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)

sql optimization join

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

在C++中搜索双精度数组中的最近值?

我在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.

c++ search stl

7
推荐指数
2
解决办法
6850
查看次数

连接ints vs连接chars(或varchars)

SQL中加入char(或varchar)值的表是否有任何性能缺陷,而不是加入整数值?

sql join

6
推荐指数
1
解决办法
1660
查看次数

ALTER TABLE具有以编程方式确定的常量DEFAULT值

我试图添加一个列(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命令的内容,但无法使其工作.谢谢!!!

t-sql sql-server default alter-table

6
推荐指数
2
解决办法
8877
查看次数

是否可以使ActiveRecord为使用:join连接选项加载的行创建对象?

我需要做这样的事情

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?

ruby activerecord join ruby-on-rails

5
推荐指数
2
解决办法
469
查看次数