2015-04-04 5 views
0

Есть ли хороший способ сделать это, или я просто направляюсь в неправильном направлении? Я хотел бы создать хранимую процедуру внутри SQL-скрипта. Я хотел бы иметь переменные, объявленные в начале сценария, чтобы я мог создавать SPROC для использования в разных контекстах/серверах. Вот что я хотел бы сделать (я знаю, что это явно не работает, но я ищет любые идеи альтернативы) ..Создание хранимой процедуры с использованием переменных

DECLARE @golbalValue = 'SomeValue' 
GO 

CREATE PROCEDURE [dbo].[MyStoredProcedure](
AS 
BEGIN 

SELECT * FROM Mytable WHERE MyCol = @globalValue 
END 
GO 

ответ

1

Что вы можете сделать, это использовать скалярную функцию для переменной

create function f() 
returns varchar(20) 
as 
begin 
    return 'some value' 
end 
go 

затем использовать его в процедуре

create proc p() 
as 
begin 
    select * 
    from my_table 
    where col = f() 
end 
go 

anot ее возможность, которая, пожалуй, более уместна, - использовать пример sqlcmdhere's.

0

Вы не можете делать то, что хотите. T-SQL не имеет понятия глобальных переменных. Один из методов - хранить значения в «глобальной» таблице, а затем ссылаться на них по мере необходимости. Что-то вроде:

create table GlobalParams (
    name varchar(255) not null primary key, 
    value varchar(255) not null 
); 
create procedure . . . 
begin 
    . . . 
    declare @value varchar(255); 
    select @value = value from Globalparams where name = 'name'; 

    select * 
    from Mytable 
    where MyCol = @value; 

    . . . 
end; 

Примечание: это упрощенный пример, который допускает только переменные, тип которых является строкой.

Вы также можете обернуть логику в определенной пользователем функции, поэтому вызов выглядит следующим образом:

select * 
    from Mytable 
    where MyCol = udf_GlobalLookup('name'); 

Это довольно редко нужны глобальные параметры, которые распределяются среди различных хранимых процедур. Такой глобальный контекст может быть полезным, иногда, для сложных систем. Вряд ли вам понадобится весь этот механизм для простого применения. Вероятно, достаточно альтернативного метода, например, просто передать параметры в качестве аргументов.

+0

## таблица также может использоваться так, чтобы таблица находилась в db только до тех пор, пока сеанс не активен –

1

Насколько я понимаю, вам нужно создать хранимые процедуры с заданным значением из ваших параметров. Однако вам не нужны входные параметры в хранимых процедурах. Во-вторых, вы хотите переключить контексты базы данных. Поэтому я думаю, вам понадобится tempTable для ваших параметров и некоторого динамического SQL. Попробуйте это:

IF OBJECT_ID('tempdb..#globalParam') IS NOT NULL 
    DROP TABLE #globalParam; 
IF OBJECT_ID('AdventureWorks2012.dbo.myTable') IS NOT NULL 
    DROP TABLE AdventureWorks2012.dbo.myTable 
IF OBJECT_ID('Master..myTable') IS NOT NULL 
    DROP TABLE Master..mytable 

--Create your data tables 
SELECT 'SomeValue' AS col1 INTO AdventureWorks2012.dbo.myTable; 
SELECT 1000  AS col1 INTO master.dbo.myTable; 


CREATE TABLE #globalParam(
          ParamName VARCHAR(100), 
          val SQL_VARIANT --SQL_Variant is designed to hold all data types. 
         ); 

--Here are your globalParams 
DECLARE @globalParam1 VARCHAR(100) = 'SomeValue'; 
DECLARE @globalParam2 INT = 1000; 

--Load your parameters into a table. Might have to cast some of your parameters to SQL_Variant 
INSERT INTO #globalParam 
VALUES ('globalParam1',@globalParam1), 
     ('globalParam2',CAST(@globalParam2 AS sql_variant)); 
GO 

--Switch database context 
USE AdventureWorks2012 
GO 
--Variable to hold CREATE PROC 
DECLARE @sql VARCHAR(MAX); 

--Set @SQL with parameter value from #globalParam 
SELECT @sql = 
'CREATE PROCEDURE dbo.myStoredProc AS 
BEGIN 
    SELECT * FROM myTable WHERE col1 = ''' + CAST(val AS VARCHAR(100)) + ''' 
END' 
FROM #globalParam 
WHERE ParamName = 'globalParam1' 

--Execute to create the stored procedure 
EXEC(@sql) 
--Execute it to see if it works 
EXEC dbo.myStoredProc 

--Switch context. Repeat same steps 
USE master 
GO 
DECLARE @sql VARCHAR(MAX); 
SELECT @sql = 
'CREATE PROCEDURE dbo.myStoredProc AS 
BEGIN 
    SELECT * FROM myTable WHERE col1 = ''' + CAST(val AS VARCHAR(100)) + ''' 
END' 
FROM #globalParam 
WHERE ParamName = 'globalParam2' 


EXEC(@sql) 
EXEC dbo.myStoredProc 


--Cleanup 
DROP PROCEDURE dbo.myStoredProc; 
USE AdventureWorks2012 
GO 
DROP PROCEDURE dbo.myStoredProc; 
Смежные вопросы