2013-06-07 4 views
0

Для тестирования мне нужно искусственно создать медленный оператор SQL. Мне удалось достичь этого на Oracle/Java (подробнее см. Ниже), но я стараюсь добиться того же результата в T-SQL/VB.Net/SQLServer.Функция SQL Server Вызов CLR для сна

Идея состоит в том, чтобы иметь функцию, которая просто спит для нескольких (скажем, 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 

В-третьих, загрузите result.class в Oracle DB:

call loadjava -user %username%/%password% com\monojohnny\sleepy.class 

Наконец, cre съел 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

проверить эту ссылку: 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 
+0

Спасибо за это - но что такое «DW»? Я не могу заставить это работать на моем экземпляре SQL Server Express? Ошибка: Msg 7202, уровень 11, состояние 2, ожидание процедуры, строка 7 Не удалось найти сервер 'DW' в sys.servers. Убедитесь, что указано правильное имя сервера. Если необходимо, выполните хранимую процедуру sp_addlinkedserver, чтобы добавить сервер в sys.servers. – monojohnny

+0

«DW» - это связанное имя сервера. Запустите «sp_linkedservers», чтобы узнать, настроены ли вы. У вас не будет «DW», но у вас наверняка будут другие. –

+0

Привет, Кевин, но какова цель Linked Server? Я пытаюсь избежать любых дополнительных изменений в БД - кроме создания функции - и, возможно, загрузки .NET-программы действительно ... – monojohnny

Смежные вопросы