我使用下面的存储过程将文件上传到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
答案 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';