首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL Server将字段值与其默认值进行比较

SQL Server将字段值与其默认值进行比较
EN

Stack Overflow用户
提问于 2009-01-20 11:17:36
回答 2查看 1.8K关注 0票数 0

我需要遍历一个表上的字段,如果它的值不等于它的默认值,我需要做一些事情。

我在触发器中,所以我知道表名。然后,我使用这个循环遍历每个字段:

代码语言:javascript
运行
复制
select @field = 0, @maxfield = max(ORDINAL_POSITION) from
INFORMATION_SCHEMA.COLUMNS where TABLE_NAME = @TableName

while @field < @maxfield
begin
...

然后,我可以通过循环获取每次迭代的字段名称:

代码语言:javascript
运行
复制
select @fieldname = COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME = @TableName
and ORDINAL_POSITION = @field

我可以得到该列的默认值:

代码语言:javascript
运行
复制
select @ColDefault = SUBSTRING(Column_Default,2,LEN(Column_Default)-2)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = @TableName
AND Column_name = @fieldname

我有了我需要的一切,但我不知道如何比较2。因为我没有将字段名作为常量,只在变量中,所以我不知道如何从'inserted‘表中获取值(请记住,我在触发器中),以便查看它是否与默认值(现在作为varchar保存在@ColDefault中)相同。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-01-20 11:50:38

首先,请记住,触发器可以与同时传入的多个记录一起触发。如果我这样做:

代码语言:javascript
运行
复制
INSERT INTO dbo.MyTableWithTrigger
  SELECT * FROM dbo.MyOtherTable

那么我在MyTableWithTrigger上的触发器将需要处理多个记录。“插入的”伪表中将有不止一条记录。

话虽如此,为了比较数据,您可以运行如下select语句:

代码语言:javascript
运行
复制
DECLARE @sqlToExec VARCHAR(8000)
SET @sqlToExec = 'SELECT * FROM INSERTED WHERE [' + @fieldname + '] <> ' + @ColDefault
EXEC(sqlToExec)

这将返回插入的伪表中与缺省值不匹配的所有行。听起来您想要对这些行做些什么,所以您可能想要做的是在调用@sqlToExec字符串之前创建一个临时表,而不仅仅是选择数据,而是将其插入到临时表中。然后,您可以使用这些行来执行所需的任何异常处理。

一个陷阱--这个T-SQL只适用于数值字段。您可能希望为不同类型的字段构建单独的处理。您可能有varchars、numerics、blob等,您需要用不同的方法来比较它们。

票数 2
EN

Stack Overflow用户

发布于 2011-01-17 23:32:46

我怀疑你可以使用和exec来做这件事。

但是为什么不只生成一次代码呢?它的性能会更好

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/460873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档