SqlServer中的数据根据该表中某字段的值的结果决定是不是显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SqlServer中的数据根据该表中某字段的值的结果决定是不是显示相关的知识,希望对你有一定的参考价值。

其如下图所示 (A表)

只显示出Sql字段的结果为true的数据
不要用存储过程,请问能实现吗?

可以使用CLR程序来解决

 

    启动VS,新建一个项目,选择数据库-SQL Server-Virtual C# SQL CLR数据库项目

    配置你当前的数据库连接(也可以不连接,在编译完成以后自行添加也行)

    在解决方案资源管理器中添加一个用户自定义函数,将让你编辑cs文件

    写入如下代码:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class UserDefinedFunctions

    [Microsoft.SqlServer.Server.SqlFunction]
    public static SqlBoolean Parse(string condition)
    
        // 在此处放置代码
        DataTable dt = new DataTable("TestTable");
        dt.Columns.Add("ID");
        dt.Rows.Add(1);
        if (dt.Select(condition).Length > 0)
            return new SqlBoolean(true);
        else
            return new SqlBoolean(false);
    
;

5. 如果是绑定了数据库,则直接在解决方案资源管理器处右键,选择部署。如果没有绑定数据库,则先进行编译,然后再进入到SQL Server数据库-可编程性-程序集中,添加本地的已编译的dll文件

6. 在SQL Server Management Studio的服务器处,右键,选择“方面”,然后在弹出窗口中将下拉框选择至“外围应用配置器”(这里我使用的是SQL Server 2008,印象当中SQL Server 2005的配置方法略有不同,需要进入到开始菜单中去寻找),然后再打开clrIntergrationEnabled,将其设置为true

7.执行如下语句:

Select * from C Where dbo.Parse(C.SQL)=1

需要说明的是,我建的数据表名为C,里面有三个字段对应的是你那三个字段。

8. 结果如下:

 

如果不明白,可以回复消息给我。以上代码在VS2010+SQL Server 2008中测试通过。

追问

谢谢您的帮助,发现SQLServer已经集成该功能了,原理应该一样,调用的是vbscript

参考技术A

就我所知,肯定是没有现成的办法来完成这个判断的。

 

我想了2个办法:

 

    自己编写一个函数,比如fcheck(sql),传入 逻辑 字符串(比如1=1), 进行逻辑计算,为真则返回1,为否则返回0  (这个比较难写,有没有可能通过动态sql来实现)

    用的时候就方便了:

    select * from a where fcheck(sql) = 1

    用存储过程,存储过程中用 动态语法,将 sql内容 放进去,获得返回结果。

     

不成熟的想法,仅供参考。

追问

谢谢您,但函数里面是不能用动态sql语句的

追答

那就 只能自己做 语法解析 ,进行 逻辑计算 了

SQL Server2008 触发器中,根据一个表修改另外一个表

SQL Server2008 中,要求写一个触发器
在表A每次添加新记录时触发,若新记录中aa字段的值在表B中ba字段不存在,则修改表B中的另一个字段bb值为表A中的aa的值。
create trigger tri_test on A after insert
as if exists(select aa from (select ba from B))
begin
update B inner join A where A.id=B.id set B.bb=A.aa;
end

请问哪里写的不对,应该怎么写?

参考技术A --你的逻辑是不是表a.id = 表b.id?
如是,试试下面的
alter trigger tri_test on A
for insert as
begin
if not exists(select * from inserted , b where inserted.id = b.id
and inserted.aa = b.ba)
begin
update b
set bb = inserted.aa
from inserted
where inserted.id = b.id
end
end追问

inserted 是关键字? 代表本次insert的记录?

追答

inserted是触发器语句中使用了两种特殊的表,即本次插入的记录.

插入记录时, 自动创建和管理inserted表。可以使用这个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。

inserted是触发器语句中使用了两种特殊的表,即本次插入的记录.

插入记录时, 自动创建和管理inserted表。可以使用这个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。

本回答被提问者采纳

以上是关于SqlServer中的数据根据该表中某字段的值的结果决定是不是显示的主要内容,如果未能解决你的问题,请参考以下文章

oracle数据库中修改表中某字段的值等于另一个表中字段的值

MySql 更新update表中某一个字段记录

如何删除EXCEL表中的大量数据行,要删除的行数大概8万

用 NOT EXISTS来查询一个表中的数据,条件是该表中的某个字段不包含另一个子查询中的值

怎么删除mysql数据库中某表中的某个字段的数据?

怎么获取DataTable中某一字段的值