2014-04-22 25 views
0

我正在寻找从一个数据库迁移到另一个数据库的几个SQL视图。两个数据库定义都是相同的,所以我不必担心兼容性问题。我将不得不在多个客户端系统上执行此任务,因此我正在寻求将其自动化,而不是使用“脚本视图另存为”选项并手动复制每个视图。游标执行t-sql创建视图语句

我是全新的游标,所以我很抱歉,如果这是一个非常简单的请求,但我已经尝试了几种方法,并没有得到任何地方。我对这个网站和其他网站的搜索结果都毫无结果。这就是我来了这么远:

declare @sql nvarchar(max) 
declare @view nvarchar(max) 
declare @dbname nvarchar(30) 
set @dbname = 'DatabaseName' 


DECLARE cCursor CURSOR LOCAL FOR 
SELECT VIEW_DEFINITION 
from INFORMATION_SCHEMA.views 
where TABLE_NAME like '%MyCriteria%' 

OPEN cCursor 
FETCH NEXT FROM cCursor into @view 
     WHILE @@FETCH_STATUS = 0 
    BEGIN 
    set @sql = 'USE ' + @dbname + ' GO ' + @view 
    execute @sql 
    FETCH NEXT FROM cCursor into @view 
END 
close cCursor 
deallocate cCursor 

我得到执行时的错误消息说: 消息203,级别16,状态2,行17 名称“USE DATA14 GO CREATE VIEW ....不是有效的标识符。

其中....表示从信息架构中获取的创建视图语句。

任何想法我做错了什么?

在此先感谢。

编辑:

我尝试另一种方法是不依赖于光标,我相信我是接近,但我仍然得到了我莫名其妙的错误:

use SourceDB 
go 

declare @sql nvarchar(max) 

set @sql = N'' 

select @sql = @sql + 'USE DestDB' + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) +       s.definition + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10) 
from sys.sql_modules as s 
inner join sys.objects as o 
on s.object_id = o.object_id 
where o.type_desc = 'VIEW' 
and s.definition like '%MyCriteria%' 

exec data14..sp_executesql @sql 
--select @sql 

错误的文本消息是: 消息102,级别15,状态1,行2 “GO”附近的语法不正确。 Msg 111,Level 15,State 1,Line 3 'CREATE VIEW'必须是查询批处理中的第一条语句。 消息102,级别15,状态1,行22 附近有语法错误GO'...... 等等等等为列表中的

回答

0

另一种选择是使用Powershell的每个视图。有很多方法可以做到这一点,我个人喜欢为每个脚本创建一个文件,并且我假定这些视图在新数据库中不存在。所以这可能不会逐字地起作用,但应该让你指出正确的方向。

  • 在服务器上创建一个导出文件夹(C:\ TEMP \查看)
  • 开启在所述资源管理器对象的源服务器。
  • 导航到源数据库(/数据库/ {数据库名})
  • 上“视图”右击并选择“开始Powershell的”
  • 执行命令,这将为每个视图创建一个文件:

    ls | ? { $_.name -match "MyCriteria" } | %{ $_.scriptheader(0) + $_.textbody > "C:\temp\views\$($_.Schema).$($_.name).sql" }

  • 导入脚本到另一个数据库与

    ls "C:\temp\views" | %{ invoke-sqlcmd -inputfile $_.fullname -database "DatabaseName" }

+0

感谢您抽出宝贵的时间,但我不认为这会为我工作的原因。我对Powershell的了解少于我对光标的了解,因此,重新设计这些以适应我的需求将非常耗时。另外,如果我理解正确,这将意味着创建目录,在控制台中运行每个语句,然后清理目录。这减少了手工劳动的数量,但仍然留下比理想的步骤更多的步骤。 – 3xStampA2xStamp

0

为了实现您要查找的内容,您必须将动态SQL嵌套在动态SQL中...

DECLARE @sql nvarchar(max) 
DECLARE @dbname nvarchar(30) 
SET @dbname = 'DatabaseName' 
SET @sql = ''; 

SELECT @sql = @sql + ' 
EXEC ' + @dbname + '.sys.sp_executesql N''' + REPLACE(VIEW_DEFINITION, '''', '''''') + '''' 
FROM INFORMATION_SCHEMA.views 
WHERE TABLE_NAME like '%table%' 

EXEC (@sql); 

虽然有一个问题。 双动态SQL需要双重逃脱。因此,上面的REPLACE。

顺便说一句...执行动态SQL的正确语法是EXEC(@SQL) - 注意括号 没有括号,你告诉服务器执行一个过程。因此,对于你的第一个错误

希望帮助