问个基础问题

FrameSniper 2008-09-05 02:42:50
我在查询分析器中写如下代码



--定义逻辑文件名称变量
DECLARE @LogicalFileName NVARCHAR(16)
DECLARE @LogicalFileName_Log NVARCHAR(16)

--给逻辑文件名称变量赋值
SET @LogicalFileName='TestDB'
SET @LogicalFileName_Log='TestDB_Log'

--定义物理数据库文件存储位置变量
DECLARE @PhysicalDataFileLocation NVARCHAR(32)
DECLARE @PhysicalLogDataFileLocation NVARCHAR(32)

--给物理数据文件位置变量赋值
SET @PhysicalDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB.MDF'
SET @PhysicalLogDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_Log.LDF'


--创建数据库
CREATE DATABASE TestDB
ON
(
NAME=@LogicalFileName,
FILENAME=@PhysicalDataFileLocation,
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME=@LogicalFileName_Log
FILENAME=@PhysicalLogDataFileLocation,
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)



GO

然后F5执行,报告错误如下

服务器: 消息 170,级别 15,状态 1,行 23
第 23 行: '@LogicalFileName' 附近有语法错误。


不知道错在何处?请各位指教!
...全文
111 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
FrameSniper 2008-09-05
  • 打赏
  • 举报
回复
DROP DATABASE TestDB

--定义逻辑文件名称变量
DECLARE @LogicalFileName NVARCHAR(16)
DECLARE @LogicalFileName_Log NVARCHAR(16)

--给逻辑文件名称变量赋值
SET @LogicalFileName='TestDB'
SET @LogicalFileName_Log='TestDB_Log'


--定义物理数据库文件存储位置变量
DECLARE @PhysicalDataFileLocation NVARCHAR(64)
DECLARE @PhysicalLogDataFileLocation NVARCHAR(64)

--给物理数据文件位置变量赋值
SET @PhysicalDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB.MDF'
SET @PhysicalLogDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_Log.LDF'

DECLARE @DynamicSQL NVARCHAR(1000)

SET @DynamicSQL='CREATE DATABASE TestDB
ON
(
NAME='+@LogicalFileName+',
FILENAME='''+@PhysicalDataFileLocation+''',
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME='+@LogicalFileName_Log+',
FILENAME='''+@PhysicalLogDataFileLocation+''',
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)'

EXEC(@DynamicSQL)

PRINT(@DynamicSQL)

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

OK
全部解决,撤帖!谢谢各位!
FrameSniper 2008-09-05
  • 打赏
  • 举报
回复
to nicewon

恩,我知道不难学,我按照你们的方法吧@变量前后都加了"'+和+'",然后执行,但出现错误信息如下

服务器: 消息 1807,级别 16,状态 3,行 1
未能获得数据库 'MODEL' 上的排它锁。请稍后再尝试该操作。
服务器: 消息 1802,级别 16,状态 1,行 1
CREATE DATABASE 失败。未能创建所列出的某些文件名。请检查前面的错误信息。
nicewon 2008-09-05
  • 打赏
  • 举报
回复
动态SQL语句不难学,只要把正常的SQL语句修改一下就可能了,变量或者参数一类的放到单引号外,其它放到单引号内(注意需要转义的字符要加单引号进行转义),用+号连接起来,然后用exec来执行就OK了。
nicewon 2008-09-05
  • 打赏
  • 举报
回复
NAME和FILENAME要加单引号的,并且需要转义
DECLARE @LogicalFileName VARCHAR(16)
DECLARE @LogicalFileName_Log VARCHAR(16)
SET @LogicalFileName='TestDB'
SET @LogicalFileName_Log='TestDB_Log'
DECLARE @PhysicalDataFileLocation VARCHAR(320)
DECLARE @PhysicalLogDataFileLocation VARCHAR(320)
SET @PhysicalDataFileLocation='D:\Program Files\TestDB.MDF'
SET @PhysicalLogDataFileLocation='D:\Program Files\TestDB_Log.LDF'
exec('CREATE DATABASE TestDB
ON
(
NAME='''+@LogicalFileName+''',
FILENAME='''+@PhysicalDataFileLocation+''',
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME='''+@LogicalFileName_Log+''',
FILENAME='''+@PhysicalLogDataFileLocation+''',
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)')
FrameSniper 2008-09-05
  • 打赏
  • 举报
回复
to cftxlin

这个错误已经改了,把@PhysicalDataFileLocation和@PhysicalLogDataFileLocation长度都定义成了64个字符

to CN_SQL,wufeng4552

我也刚刚查了资料,当表名用作变量控制的时候必须用动态SQL
我理解动态SQL的目的无非就是把要执行的SQL语句作为参数传递到EXEC过程中去,这里EXEC相当于一个函数,而要执行的语句相当于这个函数的参数
还有就是EXEC可以接受的参数也可以是一个局部变量,前面加@

我按照你们说的方式改了一下,下面是代码



--定义逻辑文件名称变量
DECLARE @LogicalFileName NVARCHAR(16)
DECLARE @LogicalFileName_Log NVARCHAR(16)

--给逻辑文件名称变量赋值
SET @LogicalFileName='TestDB'
SET @LogicalFileName_Log='TestDB_Log'

--定义物理数据库文件存储位置变量
DECLARE @PhysicalDataFileLocation NVARCHAR(64)
DECLARE @PhysicalLogDataFileLocation NVARCHAR(64)

--给物理数据文件位置变量赋值
SET @PhysicalDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB.MDF'
SET @PhysicalLogDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_Log.LDF'

DECLARE @DynamicSQL NVARCHAR(1000)

SET @DynamicSQL='CREATE DATABASE TestDB
ON
(
NAME=@LogicalFileName,
FILENAME=@PhysicalDataFileLocation,
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME=@LogicalFileName_Log,
FILENAME=@PhysicalLogDataFileLocation,
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)'

EXEC(@DynamicSQL)


但还是报错误,如下

服务器: 消息 170,级别 15,状态 1,行 4
第 4 行: '@LogicalFileName' 附近有语法错误。
  • 打赏
  • 举报
回复
--定义物理数据库文件存储位置变量
DECLARE @PhysicalDataFileLocation NVARCHAR(32)
DECLARE @PhysicalLogDataFileLocation NVARCHAR(32)

--给物理数据文件位置变量赋值
SET @PhysicalDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB.MDF'
SET @PhysicalLogDataFileLocation='D:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_Log.LDF'


上面的变量定义的有些短了,数一下你的路径有多少个字符?!
水族杰纶 2008-09-05
  • 打赏
  • 举报
回复
SQL code动态sql语句基本语法
1 :普通SQL语句可以用Exec执行

eg: Select * from tableName
Exec('select * from tableName')
Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:
declare @fname varchar(20)
set @fname = 'FiledName'
Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
Exec('select ' + @fname + ' from tableName') -- 请注意 加号前后的 单引号的边上加空格

当然将字符串改成变量的形式也可
declare @fname varchar(20)
set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句会报错



declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000)
set @s = 'select ' + @fname + ' from tableName'
Exec(@s) -- 成功
exec sp_executesql @s -- 此句正确

3. 输出参数
declare @num int,
@sqls nvarchar(4000)
set @sqls='select count(*) from tableName'
exec(@sqls)
--如何将exec执行结果放入变量中?

declare @num int,
@sqls nvarchar(4000)
set @sqls='select @a=count(*) from tableName '
exec sp_executesql @sqls,N'@a int output',@num output
select @num

FrameSniper 2008-09-05
  • 打赏
  • 举报
回复
几位,谁能加下俺QQ 175322678
QQ上请教一下
jacklinchen 2008-09-05
  • 打赏
  • 举报
回复
NAME='+@LogicalFileName+'试试,下面变量也改改
FrameSniper 2008-09-05
  • 打赏
  • 举报
回复
能说的详细点吗,俺初学
zoequlu 2008-09-05
  • 打赏
  • 举报
回复
执行动态SQL:exec(sql);
CN_SQL 2008-09-05
  • 打赏
  • 举报
回复

--调整一下
declare @s varchar(1000) --再定义一个变量
set @s = 'CREATE DATABASE TestDB
ON
(
NAME='+@LogicalFileName+',
FILENAME='+@PhysicalDataFileLocation+',
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME='+@LogicalFileName_Log +'
FILENAME=@PhysicalLogDataFileLocation,
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)
'

exec(@s)
--pring(@s) --如果执行出错,把它打印出来,然后放到查询分析器里编译一下,看是哪的问题


CN_SQL 2008-09-05
  • 打赏
  • 举报
回复
使用动态SQL语句执行,不能 直接那么写变量,这是语法规定.
CN_SQL 2008-09-05
  • 打赏
  • 举报
回复

EXEC('CREATE DATABASE TestDB
ON
(
NAME='+@LogicalFileName+',
FILENAME='+@PhysicalDataFileLocation+',
SIZE=20,
MAXSIZE=40,
FILEGROWTH=1
)
LOG ON
(
NAME='+@LogicalFileName_Log +'
FILENAME=@PhysicalLogDataFileLocation,
SIZE=5,
MAXSIZE=10,
FILEGROWTH=1
)
')

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧