[英]Creating a stored procedure using variables
有什么好的方法可以做到這一點,還是我只是朝錯誤的方向前進? 我想在一個SQL腳本中創建一個存儲過程。 我想在腳本的開頭聲明變量,以便創建可以在不同上下文/服務器中使用的SPROC。這是我想做的(我知道這顯然行不通,但是我尋找替代方案的任何想法)。
DECLARE @golbalValue = 'SomeValue'
GO
CREATE PROCEDURE [dbo].[MyStoredProcedure](
AS
BEGIN
SELECT * FROM Mytable WHERE MyCol = @globalValue
END
GO
您可以做的是對變量使用標量函數
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
這是一個示例。
據我了解,您需要使用參數中的設置值來創建存儲過程。 但是,您不希望在存儲過程中輸入參數。 其次,您要切換數據庫上下文。 因此,我認為您將需要一個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;
你不能做你想做的。 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');
很少需要在不同存儲過程之間共享的全局參數。 這樣的全局上下文有時對於復雜的系統可能很有用。 對於一個簡單的應用程序,您不太可能需要所有這些機器。 一種替代方法,例如僅將參數作為參數傳遞,可能就足夠了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.