我想创建一个存储过程,我可以将参数传递给数据库名称,它将为我创建一个视图。
我只是试图节省一些时间,因为没有为创建一次又一次地编写相同的语句。
下面是我的语法 - 如何修改它以在接受参数的存储过程中运行?
Alter View dbo.ForceClose
As
SELECT DISTINCT(SessionID) As CountofSessionID
FROM Database1
WHERE forceClosed IS NOT NULL
AND stillOpen IS NULL
and (userName is not null or userName IN ('JJones', 'MHill', 'RMort'))
Go
并且在存储过程中接受一个参数作为数据库名称(我知道这不是有效的,只是试图显示一个例子) - 像这样调用存储过程
exec dbo.Procedure 'DBName'
然后存储过程看起来像
@DBName varchar(100)
Select blah blah FROM' + @DBName + '
答案 0 :(得分:2)
你是说这个?
CREATE PROCEDURE dbo.ForceClose
(
@DBNAME NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @SQL AS NVARCHAR(255)
@SQL='SELECT DISTINCT(SessionID) As CountofSessionID
FROM ['+@DBNAME+'].[SCHEMA].[TABLE_NAME]
WHERE forceClosed IS NOT NULL
AND stillOpen IS NULL
and (userName is not null or userName IN (''JJones'', ''MHill'', ''RMort''))'
EXEC (@SQL)
END
你可以通过以下方式运行它:
EXEC ForceClose <DBNAME>
使用视图:
CREATE PROCEDURE dbo.ForceClose
(
@DBNAME NVARCHAR(MAX)
)
AS
BEGIN
DECLARE @SQL AS NVARCHAR(255)
@SQL='CREATE VIEW VIEW_'+DBNAME+' AS SELECT DISTINCT(SessionID) As CountofSessionID
FROM ['+@DBNAME+'].[SCHEMA].[TABLE_NAME]
WHERE forceClosed IS NOT NULL
AND stillOpen IS NULL
and (userName is not null or userName IN (''JJones'', ''MHill'', ''RMort''))'
EXEC (@SQL)
END
你可以通过以下方式运行它:
SELECT * FROM VIEW_<DBNAME>
答案 1 :(得分:0)
我不确定创建视图的作用;你想要的基本前提是动态SQL(关于这个主题有很多好的问题和答案。一个非常简单的答案就是
declare @myparameter nvarchar(100)= 'master'
declare @myquery nvarchar(1000)
select @myquery = 'select * from ' + @myparameter + '.dbo.sysdatabases'
select @myquery
exec sp_executeSQL @myquery
运行此命令会返回服务器上的数据库列表。
如果要创建视图;你不需要知道要查询的表吗?基本技术是相同的
declare @myparameter nvarchar(100)= 'master'
declare @myquery nvarchar(1000)
select @myquery = 'Create View myschema.vw' + @myparameter + ' as select * from ' + @myparameter + '.dbo.sysdatabases'
select @myquery
exec sp_executeSQL @myquery
如果这是在一个应用程序中,那么对于一般应用程序来说,用户执行此操作的权限非常高;你可能想用一个执行权限来包装它,以阻止人们造成太大的伤害。