2015-04-04 138 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

##表也可以使用,以便表中只有在数据库中,直到会话是活动的 – 2015-04-04 21:30:44

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;