我动态创建了一个insert语句,但是出现msg128的问题
代码如下
SET @sqlStr = N'INSERT INTO [dbo].[@name]  VALUES(@conName,@message,GETDATE());';
EXEC sp_executesql @sqlStr,N'@name USERNAME,@conName USERNAME,@message nvarchar(500)',@name,@conName,@message;
其中USERNAME是我自定义的类型nvarchar(30).
出现如下问题Msg 208, Level 16, State 1, Line 1
对象名 'dbo.@name' 无效。这该怎么办

解决方案 »

  1.   

    试试
    SET @sqlStr = N'INSERT INTO [dbo].['+@name+']  VALUES('+@conName+','+@message+',GETDATE());';EXEC sp_executesql @sqlStr,N'@name USERNAME,@conName USERNAME,@message nvarchar(500)',@name,@conName,@message;
      

  2.   

    [dbo].[@name]  VALUES(@conName,@message,GETDATE());
    这里~~
      

  3.   

    你这样相当于 直接 把@name连接到字符串里面了 ,后面就不能有 @name出现了吧
      

  4.   

    恩是的 是个变量  nvarchar(30)
      

  5.   

    谢谢 版主大人 热心帮助啊
    这个 需要 动态执行的 啊,
    我是新手,我自己试着写一个 数据库
    我会根据用户的用户名来创建一个 用它的名字命名 的表,
    所以我必须动态执行,或许我还有什么别的方法吗?
    你说要把定义的语句加进去 我不是很理解,很多例子上没有把定义的加进去的啊,而且为什么偏偏是这个@name出问题呢
      

  6.   


    不能把那个理解为一个简单的字符串吗。但是我声明 @name 的时候是nvarchar(30).
    唉 还是不能理解
    感觉 这sql语言 实在是不怎么好理解,没有 c或cpp那么 清晰 明确 啊
      

  7.   

    听了你的解释,我突然想到了为什么会 提示错误了,
    原来在动态执行语句是   系统会把 FROM后面的变量 @name当作表变量,而不是当作字符变量,因此就会出错了。
    所以我 在调用 sp_executesql之前就把@name变量带入得到sqlStr这样就不会被系统搞错了。结果就好了 哈哈。
    太谢谢版主了,你都帮我回答过好几个问题了。小弟不胜感激
    不过不得不对sql吐槽一下。这个语言设计的似乎没有那么严谨 啊 。呵呵 一家之言