存储过程语法不正确

时间:2011-09-28 10:33:51

标签: tsql stored-procedures

我使用下面的存储过程将文件上传到db中,其中每个文件都有一个对应表,但有时表不存在,我想将文件名添加到名为NewTables.I的表中没有得到存储的proc语法工作可以有人帮助我。我相信错误是在第一部分,我检查表是否存在

 ALTER proc [dbo].[UploadCSVFiles]

   @FilePath varchar(100) ,
   @FileName varchar(100),  
   @TableName varchar(250)
AS
BEGIN
DECLARE @SqlStmt nvarchar(max) 
DECLARE @ErrorCode int

SET @SqlStmt='Truncate table dbo.[' + @TableName +']'
EXEC(@SqlStmt);
set @SqlStmt =N' 
IF  not EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].['+@TableName +N']'') AND type in (N''U''))
BEGIN 
    INSERT INTO dbo.NewTables ('+@TableName+N','+@FileName+N') Values('+@TableName+N','+@FileName+N')


  END 
ELSE 
  BEGIN 
    INSERT INTO '+@TableName+N'
select *
from openrowset(''MSDASQL''
               ,''Driver={Microsoft Access Text Driver (*.txt, *.csv)}; 
                    DefaultDir='+@FilePath+N'''
               ,''select * from "'+@FileName+N'"'')

  END
  '
  EXEC(@SqlStmt);

由于 饶

感谢fpop和Christine,我已经提出了你的建议,但我仍然收到错误

Msg 4701, Level 16, State 1, Line 1
Cannot find the object "Customer" because it does not exist or you do not have permissions.

似乎If语句没有插入新表

这是最终版本

USE [MyDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

  ALTER proc [dbo].[UploadFiles_2]

  @FilePath varchar(100) ,
  @FileName varchar(100),  
  @TableName varchar(250)
AS
BEGIN
DECLARE @SqlStmt nvarchar(max) 
DECLARE @ErrorCode int

SET @SqlStmt='Truncate table dbo.[' + @TableName +']'
EXEC sp_executesql @SqlStmt;
set @SqlStmt =N' 
IF ( NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].['+@TableName +N']'') AND type in (N''U''))
BEGIN 
    INSERT INTO dbo.NewTables (TableName,FileName) Values('''+@TableName+N''','''+@FileName+N''')    

  END 
ELSE 
  BEGIN 
    INSERT INTO '+@TableName+N'
    select *
    from openrowset(''MSDASQL''
               ,''Driver={Microsoft Access Text Driver (*.txt, *.csv)}; 
                    DefaultDir='+@FilePath+N'''
               ,''select * from "'+@FileName+N'"'')

  END'

   EXEC sp_executesql @SqlStmt;

 END 

2 个答案:

答案 0 :(得分:1)

提示:您始终可以添加PRINT @SQLSTMT以查看您的过程生成的代码。

脚本中有两个错误,都在行中:

INSERT INTO dbo.NewTables ('+@TableName+N','+@FileName+N') Values('+@TableName+N','+@FileName+N')

第一个错误:NewTables表必须有2列才能保存表名和文件名。我们称之为COL_TBL,COL_FILE

第二个错误:您必须在声明的值部分

中添加引号

以下是它的样子:

    INSERT INTO dbo.NewTables (COL_TBL, COL_FILE) Values('''+@TableName+N''','''+@FileName+N''')
顺便说一句,你没有完全发布代码,最后有一个END缺失。请下次复制整个代码,以便其他人可以重现错误。

编辑:请考虑以下内容:使用sp_executesql而不是EXEC,以避免sql注入错误不将参数连接到动态sql中,最后在截断之前检查表是否存在

答案 1 :(得分:0)

试试这个

IF (NOT EXISTS (SELECT * FROM sys.objects WHERE [type] LIKE 'U' AND name LIKE 'mytable')) 
    SELECT 'not found';
ELSE
    SELECT 'found';