我创建了一个在运行时创建表的存储过程。此动态表的表列及其数据类型来自数据库中已存在的另一个表。
我从C#控制台应用程序代码调用此存储过程。存储过程抛出语法错误,我完全无法弄清楚导致此语法错误的原因。
这是我写的存储过程代码:
CREATE procedure [dbo].[sproc_TableExists]
@TableName NVARCHAR(128)
,@Column1Name NVARCHAR(32)
,@Column1DataType NVARCHAR(32)
,@Column1Nullable NVARCHAR(32)
AS
DECLARE @SQLString NVARCHAR(MAX)
BEGIN
IF( EXISTS (select * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @TableName))
BEGIN
SET @SQLString = 'ALTER TABLE ' + @TableName + '( '+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')'
EXEC (@SQLString)
END
ELSE
BEGIN
SET @SQLString = 'CREATE TABLE ' + @TableName + '( '+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')'
EXEC (@SQLString)
END
END
GO
错误我从代码中调用它:
'('。
附近的语法不正确
答案 0 :(得分:2)
在更改现有表时,问题在于以下代码行:
SET @SQLString = 'ALTER TABLE ' + @TableName + '( '+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable +')'
这将生成以下输出(作为使用伪表\列名称的示例):
ALTER TABLE TableEx( ColumnEx NVARCHAR(MAX) NULL)
但是,这不是有效的SQL语句。
如果您希望在表已存在时添加新列,请改为使用:
SET @SQLString = 'ALTER TABLE ' + @TableName + ' ADD '+ @Column1Name + ' ' + @Column1DataType + ' '+ @Column1Nullable
哪个会产生输出:
ALTER TABLE TableEx ADD ColumnEx NVARCHAR(MAX) NULL
请注意,如果您打算更改预先存在的表中预先存在的列的名称,则需要单独测试 - 上面只会向现有表添加新列。
答案 1 :(得分:1)
替换
EXEC (@SQLString)
与
EXEC @SQLString