使用变量创建存储过程

时间:2015-04-04 19:08:00

标签: sql sql-server tsql stored-procedures

有没有什么好方法可以做到这一点,还是我只是朝着错误的方向前进?我想在SQL脚本中创建一个存储过程。我想在脚本的开头声明变量,以便我可以创建SPROC以在不同的上下文/服务器中使用。这就是我想做的事情(我知道这显然不起作用,但我和#39; m寻找替代方案的任何想法)..

DECLARE @golbalValue = 'SomeValue'
GO

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

SELECT * FROM Mytable WHERE MyCol = @globalValue
END
GO

3 个答案:

答案 0 :(得分: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

另一种可能更合适的可能性是使用sqlcmd here's作为例子。

答案 1 :(得分:1)

据我所知,您需要使用参数中的set值创建存储过程。但是,您不希望存储过程中的输入参数。其次,您要切换数据库上下文。所以我认为你的参数和一些动态SQL需要一个tempTable。试试这个:

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;

答案 2 :(得分: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');

很少需要在不同存储过程之间共享的全局参数。这种全局背景有时对复杂系统很有用。您不太可能需要所有这些机器来进行简单的应用。另一种方法,例如将参数作为参数传递,可能就足够了。