执行创建表的存储过程时出现错误消息

时间:2012-09-19 12:34:19

标签: sql-server

alter procedure SP_employeedetails
(
 @tablename varchar(50),
 @empname varchar(50),
 @age int,
 @address varchar (50)
)
as
begin
declare @xxx varchar(50)
set  @xxx= 'create table '+@tablename+'
( '+@empname+'varchar(50),
   '+@age+' int ,
    '+@address+' varchar(50)
)'
print @xxx
exec (@xxx)
end

当我使用声明

对此进行处理时
exec SP_employeedetails 'Employeedetails', 'jhon', 25, 'cochin'

显示以下错误消息

  

Msg 245,Level 16,State 1,Procedure SP_employeedetails,Line 11   
转换varchar值'create table时转换失败   Employeedetails(jhonvarchar(50),        '到数据类型int。

3 个答案:

答案 0 :(得分:4)

一些潜在的问题:

  1. 列名和数据类型之间的空格
  2. 尝试将int添加到字符串
  3. 你的字符串几乎肯定会超过50个字符
  4. 年龄列名称是一个数字 - 需要正确转义。我逃脱了所有人的安全。您应该注意@empname Jimmy O'Shea253 Main Street等地址 - 这些列名在您当前的脚本中无效。
  5. 对于你的字符串来说,50个字符显然是不够的。我们来试试吧:
  6. declare @xxx varchar(50)
    
    set  @xxx= 'create table employeedetails
    ( john varchar(50),
       [25] int ,
        cochin varchar(50)
    )'
    
    print @xxx;
    

    结果:

    create table employeedetails
    ( john varchar(50),
    

    我将如何做到这一点:

    ALTER PROCEDURE dbo.SP_employeedetails
    (
     @tablename varchar(50),
     @empname varchar(50),
     @age int,
     @address varchar (50)
    )
    as
    begin
      SET NOCOUNT ON;
    
      DECLARE @sql NVARCHAR(2000); -- 50 is unlikely enough
    
      SET @sql = N'create table dbo.' + @tablename + '
      ( ' + QUOTENAME(@empname) + ' varchar(50), -- need space here
       '+ QUOTENAME(CONVERT(VARCHAR(12), @age) +' int , -- need to convert this and delimit
        '+ QUOTENAME(@address) + ' varchar(50)
      );';
    
      PRINT @sql;
      EXEC sp_executesql @sql;
    END
    GO
    

    但是,正如我在评论中提到的,您是否真的为添加到系统中的每位员工创建了一个新的?看起来这应该是在表中插入一行,而不是创建一个全新的表。

    最后,you should not be using the SP_ prefix for stored procedures

答案 1 :(得分:2)

你在类型之前缺少一个空格:

'+@empname+'varchar(50),

您必须将@age参数强制转换为varchar类型。

答案 2 :(得分:1)

[我的回答解释了您收到的错误,但这是您遇到的最少问题 - Aaron's answer包含对它们的详细分析]

您需要明确地将@age转换为varchar

Data Type Precedence

  

当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定具有较低优先级的数据类型转换为具有较高优先级的数据类型。如果转换不是受支持的隐式转换,则会返回错误。当两个操作数表达式具有相同的数据类型时,操作的结果具有该数据类型。

数据类型int的优先级高于varchar,因此SQL Server会尝试将@xxx转换为int