Sql server SQL Server函数调用CLR使其休眠

Sql server SQL Server函数调用CLR使其休眠,sql-server,vb.net,function,clr,Sql Server,Vb.net,Function,Clr,为了进行测试,我需要人为地创建一个慢SQL语句。 我已经在Oracle/Java上实现了这一点(详细信息见下文),但在T-SQL/VB.Net/SQLServer中却很难实现同样的目标 其思想是让函数只休眠几秒钟(比如说5秒钟),然后返回一个伪值 我曾尝试(作为替代)使用“waitfor”T-SQL,但这在函数中是不允许的(显然有副作用);所以我在想(除了创建庞大的表或旋转嵌套的空循环之外),最好的方法是通过CLR对象 有人能提供一些简单的步骤来实现这一点吗 以下是我在Oracle中遵循的步骤:

为了进行测试,我需要人为地创建一个慢SQL语句。 我已经在Oracle/Java上实现了这一点(详细信息见下文),但在T-SQL/VB.Net/SQLServer中却很难实现同样的目标

其思想是让函数只休眠几秒钟(比如说5秒钟),然后返回一个伪值

我曾尝试(作为替代)使用“waitfor”T-SQL,但这在函数中是不允许的(显然有副作用);所以我在想(除了创建庞大的表或旋转嵌套的空循环之外),最好的方法是通过CLR对象

有人能提供一些简单的步骤来实现这一点吗

以下是我在Oracle中遵循的步骤: 首先创建一个Java类来执行以下操作:

package com.monojohnny;
public class sleepy {
            public static String sleep()  {
                int seconds=5;
                try {
                        Thread.sleep(seconds * 1000);
                }
                catch(Exception e) { ; }
                return "Finished Sleeping for "+Integer.toString(seconds)+" seconds.";

            }
}
第二,编译它,使用类似于:

javac -source 1.4 -target 1.4 com/monojohnny/sleepy.java
第三,将生成的.class文件加载到Oracle数据库中:

call loadjava -user %username%/%password% com\monojohnny\sleepy.class
最后,创建一个PL/SQL函数来调用类的方法:

CREATE OR REPLACE FUNCTION sleepy RETURN VARCHAR2
            AS LANGUAGE JAVA
            NAME 'com.monojohnny.sleepy.sleep() return java.lang.String';
    /
    show errors
    quit;
这是测试功能的结果:

SQL> select sleepy from dual;
Finished Sleeping for 5 seconds
查看此链接:


谢谢,但是什么是“DW”?我无法在我的SQL Server Express实例上使用此功能?错误是:Msg 7202,11级,状态2,过程等待,第7行在sys.servers中找不到服务器“DW”。验证是否指定了正确的服务器名称。如有必要,执行存储过程sp_addlinkedserver以将服务器添加到sys.servers。“DW”是链接的服务器名称。运行“sp_LinkedServer”以查看是否已配置任何。你不会有“DW”,但你可能会有其他的。嗨,凯文-但是链接服务器的用途是什么?我正试图避免对数据库进行任何额外的更改(除了创建一个函数之外),并可能上载一个.NET程序。实际上,这个链接:允许我添加一个“虚拟”本地“链接服务器”…它起了作用-我将这个问题保留一小会儿-我仍然对CLR方法感兴趣-但我会回来接受它如果我没有收到任何基于CLR的解决方案,则接受答案。谢谢你在这方面的帮助。
CREATE FUNCTION dbo.wait()
RETURNS INT
AS
BEGIN

DECLARE @i INT = (
    SELECT TOP 1 1 
    FROM OPENQUERY(DW, 'waitfor delay ''00:00:05.000'' select 1 as n')
);

RETURN 1;
END;
GO