用exec(...)创建视图问题。急!谢谢。

declare @strDB varchar(200)
set @strDB='DBname'
exec ('use '+@strDB+' /* */ CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey')

错误提示信息为:'CREATE VIEW' 必须是批查询中的第一条语句。
---------------------------------------------------------------

你只能先执行:
exec('use '+@strDB')
然后执行:
exec('CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey')

CREATE VIEW 必须作为单独的语句执行或者前面有一个Go分隔符。
祝你好运!!!

---------------------------------------------------------------

有两个问题
1. 数据库环境的更改只在 EXECUTE 语句结束前有效。
例如,在这个例子的 EXEC 后,数据库环境还是 master:
USE master
EXEC ('USE pubs')
SELECT * FROM authors --出错

2. Create View 必须是批处理中的第一条语句,也就是说
EXEC ('Create view dbo.view1 as select * from authors') 可以但
EXEC ('Use Pubs Create view dbo.view1 as select * from authors') 不行

---------------------------------------------------------------

我估计你的@strDB是输入参数,可以改成这样

declare @strDB varchar(200)
set @strDB='DBName'

if @strDB = 'DBName'
use DBName
else if @strDB = 'DBName2'
use DBName2
else ...

/* */
CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey
---------------------------------------------------------------

declare @strDB varchar(200)
set @strDB='DBname'
exec ('use '+@strDB)
GO
EXEC('CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey')

---------------------------------------------------------------

我记得这些写是无效的:
declare @strDB varchar(200)
set @strDB='DBname'
exec ('use '+@strDB)

不会出错,但是没有任何效果。

---------------------------------------------------------------

将两句分开写不就行了吗?

declare @strDB varchar(200)
set @strDB='DBname'
exec ('use '+@strDB)
exec(' /* */ CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey')
---------------------------------------------------------------

declare @strDB varchar(200)
set @strDB='DBname'
exec ('use '+@strDB+' go CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey')
---------------------------------------------------------------

J9988,J老师的答案:

declare @strDB varchar(200)
set @strDB='test'
declare @sql varchar(1000)
set @sql=' osql -U sa -P ruirui -d '+@strdb+' -q " CREATE VIEW dbo.viewDbsy2
AS
SELECT d.nodekey,t.mc
FROM dbo.bDocFlow d INNER JOIN
dbo.BTree t ON d.nodekey = t.nodeKey"'

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus