SQL Server函数调用CLR进入睡眠状态

时间:2013-06-07 17:50:32

标签: sql-server vb.net function clr

为了进行测试,我需要人为地创建一个缓慢的SQL语句。 我已经设法在Oracle / Java上实现了这一点(详情如下),但我很难在T-SQL / VB.Net / SQLServer中实现相同的目标。

我们的想法是拥有一个只能睡几下(比如说5秒)并返回一个虚拟值的函数。

我已尝试(作为替代方案)使用'waitfor'T-SQL,但这在FUNCTIONS中是不允许的(副作用显然);所以我在想(除了创建大量的表,或者旋转嵌套的空循环),最好的方法是通过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 DB中:

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

1 个答案:

答案 0 :(得分:1)

点击此链接:http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/e8f32710-9424-48a8-8de1-523457ea291f

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