Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用存储过程创建视图_Sql Server_Stored Procedures_Sql Server 2000 - Fatal编程技术网

Sql server 使用存储过程创建视图

Sql server 使用存储过程创建视图,sql-server,stored-procedures,sql-server-2000,Sql Server,Stored Procedures,Sql Server 2000,我想创建一个存储过程,我可以将数据库名称的参数传递给它,它将为我创建一个视图 我只是想节省一些时间,不为一个create vew一遍又一遍地写同样的语句 下面是我的语法-如何修改它以在接受参数的存储过程中运行 Alter View dbo.ForceClose As SELECT DISTINCT(SessionID) As CountofSessionID FROM Database1 WHERE forceClosed IS NOT NULL AND stillOpen IS

我想创建一个存储过程,我可以将数据库名称的参数传递给它,它将为我创建一个视图

我只是想节省一些时间,不为一个create vew一遍又一遍地写同样的语句

下面是我的语法-如何修改它以在接受参数的存储过程中运行

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 + '

我不确定创建视图正在做什么;您需要的基本前提是动态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 
如果这是在一个应用程序中,那么对于一个普通应用程序来说,这样做的用户权限将非常高;你可能想用execute as权限来包装它,以阻止人们造成太大的伤害。

你是说这个

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>
SELECT * FROM VIEW_<DBNAME>
您可以通过以下方式运行它:

EXEC ForceClose <DBNAME>
SELECT * FROM VIEW_<DBNAME>

我不太清楚你想做什么。使用存储过程来创建视图我得到了那个部分,但我不明白你想传递给它什么?一个用作数据库名称的参数。类似于在存储过程中创建一个变量@DBName varchar100,并将该变量传递给数据库名的存储过程。我将编辑我的原始帖子,希望它更有意义。我将创建的视图的名称放在哪里?我在视图中添加了第二个版本。我将视图名称硬编码为view_和dbname。请记住更改架构和表名。