簡體   English   中英

使用變量創建存儲過程

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM