有没有什么好方法可以做到这一点,还是我只是朝着错误的方向前进?我想在SQL脚本中创建一个存储过程。我想在脚本的开头声明变量,以便我可以创建SPROC以在不同的上下文/服务器中使用。这就是我想做的事情(我知道这显然不起作用,但我和#39; m寻找替代方案的任何想法)..
DECLARE @golbalValue = 'SomeValue'
GO
CREATE PROCEDURE [dbo].[MyStoredProcedure](
AS
BEGIN
SELECT * FROM Mytable WHERE MyCol = @globalValue
END
GO
答案 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');
很少需要在不同存储过程之间共享的全局参数。这种全局背景有时对复杂系统很有用。您不太可能需要所有这些机器来进行简单的应用。另一种方法,例如将参数作为参数传递,可能就足够了。