执行t-sql create view语句的游标
我希望将多个SQL视图从一个数据库迁移到另一个数据库。这两个数据库的定义是相同的,所以我不必担心兼容性问题。我必须在多个客户端系统上执行此任务,因此我希望将其自动化,而不是使用“脚本视图为”选项并手动复制每个视图 我对游标是全新的,所以如果这是一个非常简单的请求,我很抱歉,但我已经尝试了几种方法,但都一无所获。我对这个网站和其他网站的搜索同样没有结果。这就是我到目前为止的想法:执行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
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”}
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的了解比我对游标的了解要少,因此修改它以满足我的需要将非常耗时。另外,如果我理解正确,这将意味着创建目录,在控制台中运行每个语句,然后清理目录。这减少了体力劳动量,但仍然留下了比理想情况更多的步骤。