0
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'

显示以下错误消息

消息 245,级别 16,状态 1,过程 SP_employeedetails,第 11 行将
varchar 值“create table Employeedetails (jhonvarchar(50),”转换为数据类型 int 时转换失败。

4

3 回答 3

4

几个潜在的问题:

  1. 列名和数据类型之间的空格
  2. 尝试将 int 添加到字符串
  3. 您的字符串几乎可以肯定超过 50 个字符
  4. 年龄列名称是一个数字 - 这需要正确转义。为了安全,我逃离了一切。您应该注意@empname类似Jimmy O'Shea或类似的地址253 Main Street- 这些列名在您当前的脚本中无效。
  5. 50 个字符显然不足以满足您的字符串。让我们尝试一下:
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

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

最后,您不应该使用SP_存储过程的前缀

于 2012-09-19T12:42:22.840 回答
2

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

'+@empname+'varchar(50),

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

于 2012-09-19T12:39:31.340 回答
1

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

您需要显式转换@agevarchar.

数据类型优先级

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

数据类型int的优先级高于varchar,因此 SQL Server 尝试转换@xxxint.

于 2012-09-19T12:36:59.310 回答