2015-04-04 111 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;