日期:2014-05-18  浏览次数:20378 次

请教个使用动态SQL创建存储过程的问题
小弟最近把一张大的数据表做了下水平拆分,拆成了若干个数据。

虽然原来的数据库主要是保存数据为主,但是也有几个存储过程需要同步到各个新数据库。而这次的拆分方案是根据某个日期字段进行的,每个月一个数据表。也就是类似“DB0911”,“DB1002”这种格式。

现在建表、导入数据小弟都搞定了,不过建立存储过程的时候出了点麻烦。小弟仿照建表的样子这么写了建立存储过程的语句:

SQL code

DECLARE @dt DATE
    SET @dt = GETDATE()
DECLARE @dbName VARCHAR(20)
    SET @dbName = 'DB' + CONVERT(VARCHAR(4), @dt, 12)

EXEC ('USE [' + @dbName + ']

CREATE PROCEDURE sp_Test
AS
BEGIN
    PRINT ''Hello World''
END')



然后返回编译错误:消息 111,级别 15,状态 1,过程 sp_Test,第 7 行
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.

小弟功力不够,不知道这部分应该怎么写。现在拆分出来的数据库大概有40多个,一个一个人肉去建是很纠结的事情,而且以后项目运行的时候也是需要根据日期动态创建数据库和表的,所以这个问题不解决还不行。

有请各位支招,小弟感激不尽

------解决方案--------------------
SQL code
DECLARE @dt datetime
    SET @dt = GETDATE()
DECLARE @dbName VARCHAR(20)
    SET @dbName = 'DB' + CONVERT(VARCHAR(4), @dt, 12)

EXEC ('USE [' + @dbName + ']')
go
CREATE PROCEDURE sp_Test
AS
BEGIN
    PRINT 'Hello World'
END

把存储过程与use DB分开写试试

------解决方案--------------------
SQL code


DECLARE @dt DATE
    SET @dt = GETDATE()
DECLARE @dbName VARCHAR(20)
    SET @dbName = 'DB' + CONVERT(VARCHAR(4), @dt, 12)
declare @s = 'use '+@dbname+' go create procedure sp_Test as begin print ''Hello World'' end'

--可以先输出看看
print @s

exec(@s)

------解决方案--------------------
高手解决吧。。。路过。。
------解决方案--------------------
能力欠佳 高手解答~Up!
------解决方案--------------------
请问楼主拆分数据库是怎么做的?小弟没这方面的经验啊T-T
------解决方案--------------------
顶楼上,也想知道如何拆分