SQL 建表语句字符串拼接

gzw13999 2014-03-11 08:21:44

DECLARE @datechar varchar(10)
SET @datechar= CONVERT(varchar(10), GETDATE(), 23)

CREATE TABLE [dbo].[completeTopic_'+@datechar+']


表名后面加个日期后缀.

如果把语句放进nvarchar中
SET @sqlchar='CREATE TABLE [dbo].[completeTopic_'+@datechar+']

会有错误提示会提示 Incorrect syntax near the keyword 'CREATE'.

建表的语句包括索引 约束 默认值 索引名字也是有日期后缀的,怎么拼接一个日期字符串到SQL语句中.
...全文
313 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2014-03-12
  • 打赏
  • 举报
回复
可以把@sqlchar的内容打印出来,手工执行看哪里报错,

-- 把exec(@sqlchar)暂时换为如下语句
print @sqlchar
LongRui888 2014-03-12
  • 打赏
  • 举报
回复
引用 3 楼 gzw13999 的回复:
[quote=引用 2 楼 yupeigu 的回复:] 动态生成的语句大概就是这样的:
CREATE TABLE [dbo].[completeTopic_2014-03-11](a int,b datetime,c varchar(10))
如果还有索引,也需要加上日期,那么和这个表的名称是一样的,另外,其他的default默认值,都是比较简单的
我这的语句Select出来的没问题 可是EXEC sp_executesql @sqlchar 就这样了 这里是不是需要转义?? [/quote] 这个go,只是在ssms中执行是可以的,但是如果放到语句当中,动态执行会有问题:
exec('select 1; 
      go 
      select 2;')
/*
消息 102,级别 15,状态 1,第 2 行
'go' 附近有语法错误。

*/
直面人生 2014-03-12
  • 打赏
  • 举报
回复
引用 5 楼 DBA_Huangzj 的回复:
拼接里面不能用go,你试试这种写法:
DECLARE @sql NVARCHAR(max)
SET @sql='select 1'+CHAR(13)+'go'+CHAR(13)+'select 2'
print(@sql)

/*
select 1
go
select 2
*/
u014000671 2014-03-12
  • 打赏
  • 举报
回复
發糞塗牆 2014-03-12
  • 打赏
  • 举报
回复
拼接里面不能用go,你试试这种写法:
DECLARE @sql NVARCHAR(max)
SET @sql='select 1'+CHAR(13)+'go'+CHAR(13)+'select 2'
print(@sql)

/*
select 1
go
select 2
*/
gzw13999 2014-03-12
  • 打赏
  • 举报
回复
还有GO也报错了
gzw13999 2014-03-12
  • 打赏
  • 举报
回复
引用 2 楼 yupeigu 的回复:
动态生成的语句大概就是这样的:
CREATE TABLE [dbo].[completeTopic_2014-03-11](a int,b datetime,c varchar(10))


如果还有索引,也需要加上日期,那么和这个表的名称是一样的,另外,其他的default默认值,都是比较简单的

我这的语句Select出来的没问题

可是EXEC sp_executesql @sqlchar 就这样了


这里是不是需要转义??
LongRui888 2014-03-11
  • 打赏
  • 举报
回复
动态生成的语句大概就是这样的:
CREATE TABLE [dbo].[completeTopic_2014-03-11](a int,b datetime,c varchar(10))
如果还有索引,也需要加上日期,那么和这个表的名称是一样的,另外,其他的default默认值,都是比较简单的
LongRui888 2014-03-11
  • 打赏
  • 举报
回复
右边少了一个引号,然后得加上括号 和 字段, 修改了一下你的代码,简单的例子:

DECLARE @datechar varchar(10)
declare @sqlchar nvarchar(1000)

SET @datechar= CONVERT(varchar(10), GETDATE(), 23)


SET @sqlchar='CREATE TABLE [dbo].[completeTopic_'+@datechar+'](' +
             'a int,b datetime,c varchar(10)'+
             ')'

select @sqlchar

--exec(@sqlchar)
以最短的时间学会Mybatis,并使用到项目中,包括搜集的很多资料;很全很全:并且有项目实例 例如:mybatis中的#和$的区别? 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:order by #user_id#,如果传入的值是111,那么解析成sql时的值为order by "111", 如果传入的值是id,则解析成的sql为order by "id".    2. $将传入的数据直接显示生成在sql中。如:order by $user_id$,如果传入的值是111,那么解析成sql时的值为order by user_id, 如果传入的值是id,则解析成的sql为order by id.    3. #方式能够很大程度防止sql注入。    4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象,例如传入表名.    6.一般能用#的就别用$. MyBatis排序时使用order by 动态参数时需要注意,用$而不是# 字符串替换 默认情况下,使用#{}格式的语法会导致MyBatis创建预处理语句属性并以它为背景设置安全的值(比如?)。这样做很安全,很迅速也是首选做法,有时你只是想直接在SQL语句中插入一个不改变的字符串。比如,像ORDER BY,你可以这样来使用: ORDER BY ${columnName} 这里MyBatis不会修改或转义字符串。 重要:接受从用户输出的内容并提供给语句中不变的字符串,这样做是不安全的。这会导致潜在的SQL注入攻击,因此你不应该允许用户输入这些字段,或者通常自行转义并检查。

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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