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。
答案 0 :(得分:4)
一些潜在的问题:
@empname
Jimmy O'Shea
或253 Main Street
等地址 - 这些列名在您当前的脚本中无效。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
。
当运算符组合了两种不同数据类型的表达式时,数据类型优先级的规则指定具有较低优先级的数据类型转换为具有较高优先级的数据类型。如果转换不是受支持的隐式转换,则会返回错误。当两个操作数表达式具有相同的数据类型时,操作的结果具有该数据类型。
数据类型int
的优先级高于varchar
,因此SQL Server会尝试将@xxx
转换为int
。