我想要一个简单的存储过程来删除表。这是我的第一次尝试:
CREATE PROC bsp_susf_DeleteTable (@TableName char)
AS
IF EXISTS (SELECT name FROM sysobjects WHERE name = @TableName)
BEGIN
DROP TABLE @TableName
END当我在MS Query Analyser中解析它时,我得到以下错误:
Server: Msg 170, Level 15, State 1, Procedure bsp_susf_DeleteTable, Line 6
Line 6: Incorrect syntax near '@TableName'.这在某种意义上是有意义的,因为单个表的正常SQL是:
IF EXISTS (SELECT name FROM sysobjects WHERE name = 'tbl_XYZ')
BEGIN
DROP TABLE tbl_XYZ
END注tbl_XYZ的第一个实例(在WHERE子句中)用单引号括起来,而DROP语句中的第二个实例没有单引号。如果我使用一个变量(@TableName),那么我就无法做出这样的区分。
那么,可以创建一个存储过程来实现这一点吗?或者我必须复制如果存在..。到处都是?
发布于 2009-07-09 01:09:40
您应该能够使用动态sql:
declare @sql varchar(max)
if exists (select name from sysobjects where name = @TableName)
BEGIN
set @sql = 'drop table ' + @TableName
exec(@sql)
END希望这能有所帮助。
更新:是的,你可以让@sql变得更小,这只是一个简单的例子。还要注意有关SQL注入攻击的其他注释
https://stackoverflow.com/questions/1101331
复制相似问题