执行t-sql create view语句的游标

执行t-sql create view语句的游标,sql,sql-server,cursor,dynamic-sql,Sql,Sql Server,Cursor,Dynamic Sql,我希望将多个SQL视图从一个数据库迁移到另一个数据库。这两个数据库的定义是相同的,所以我不必担心兼容性问题。我必须在多个客户端系统上执行此任务,因此我希望将其自动化,而不是使用“脚本视图为”选项并手动复制每个视图 我对游标是全新的,所以如果这是一个非常简单的请求,我很抱歉,但我已经尝试了几种方法,但都一无所获。我对这个网站和其他网站的搜索同样没有结果。这就是我到目前为止的想法: declare @sql nvarchar(max) declare @view nvarchar(max) decl

我希望将多个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” .... 不是有效的标识符

在哪里。。。。表示我从信息架构中获取的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
错误消息的文本为: Msg 102,15级,状态1,第2行 “GO”附近的语法不正确。 消息111,第15级,状态1,第3行 “创建视图”必须是查询批处理中的第一条语句。 Msg 102,15级,状态1,第22行 “GO”附近的语法不正确。。。。。。
依此类推,对于列表中的每个视图,另一个选项是使用Powershell。有很多方法可以做到这一点,我个人喜欢为每个脚本创建一个文件,我假设新数据库中不存在视图。因此,这可能无法一字不差地工作,但应该可以为您指明正确的方向

  • 在服务器上创建导出文件夹(C:\Temp\Views)
  • 在对象资源管理器中打开源服务器
  • 导航到源数据库(/Databases/{DatabaseName})
  • 右键单击“视图”并选择“启动Powershell”
  • 运行以下命令,该命令将为每个视图创建一个文件:

    ls |?{$\.name-匹配“MyCriteria”}{$\.scriptheader(0)+$\.textbody>“C:\temp\views\$($\.Schema)。$($\.name.sql”}

  • 使用将脚本导入另一个数据库

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


要实现所需的功能,必须将动态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需要双重转义。因此,需要替换上述内容

顺便说一下。。。执行动态SQL的正确语法是EXEC(@SQL)——请注意括号 如果没有括号,您将告诉服务器执行一个过程。这就是你第一次犯错的原因


希望这能有所帮助

谢谢你抽出时间,但我认为这对我不起作用。我对Powershell的了解比我对游标的了解要少,因此修改它以满足我的需要将非常耗时。另外,如果我理解正确,这将意味着创建目录,在控制台中运行每个语句,然后清理目录。这减少了体力劳动量,但仍然留下了比理想情况更多的步骤。