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. age カラム名は数字です - これは適切にエスケープする必要があります。私は安全のためにすべてを逃げました。@empnamelikeJimmy O'Sheaまたは address likeに注意する必要が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

[私の答えはあなたが得ているエラーを説明していますが、それはあなたの問題の中で最も少ないものです -アーロンの答えにはそれらの詳細な分析が含まれています]

@ageに明示的に変換する必要がありますvarchar

データ型の優先順位:

演算子が異なるデータ型の 2 つの式を結合する場合、データ型の優先順位の規則により、優先順位の低いデータ型が優先順位の高いデータ型に変換されることが指定されます。変換がサポートされている暗黙的な変換でない場合は、エラーが返されます。両方のオペランド式が同じデータ型の場合、演算の結果はそのデータ型になります。

データ型intは よりも優先順位が高いvarcharため、SQL Server は に変換しようとし@xxxますint

于 2012-09-19T12:36:59.310 に答える