2011-09-28 139 views
0

我正在使用下面的存儲過程上傳文件到一個數據庫,其中每個文件都有一個對應表,但有時候表不存在,在這種情況下,我想將文件名添加到名爲NewTables.I無法獲得存儲過程語法工作有人可以幫助我。我相信錯誤是在我檢查表中存在不正確的存儲過程語法

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].['[email protected] +N']'') AND type in (N''U'')) 
BEGIN 
    INSERT INTO dbo.NewTables ('[email protected]+N','[email protected]+N') Values('[email protected]+N','[email protected]+N') 


    END 
ELSE 
    BEGIN 
    INSERT INTO '[email protected]+N' 
select * 
from openrowset(''MSDASQL'' 
       ,''Driver={Microsoft Access Text Driver (*.txt, *.csv)}; 
        DefaultDir='[email protected]+N''' 
       ,''select * from "'[email protected]+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. 

看來如果語句不插入新表

這裏是最後的版本

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].['[email protected] +N']'') AND type in (N''U'')) 
BEGIN 
    INSERT INTO dbo.NewTables (TableName,FileName) Values('''[email protected]+N''','''[email protected]+N''')  

    END 
ELSE 
    BEGIN 
    INSERT INTO '[email protected]+N' 
    select * 
    from openrowset(''MSDASQL'' 
       ,''Driver={Microsoft Access Text Driver (*.txt, *.csv)}; 
        DefaultDir='[email protected]+N''' 
       ,''select * from "'[email protected]+N'"'') 

    END' 

    EXEC sp_executesql @SqlStmt; 

END 
+0

嗨之前就存在,你有,你可以發佈一個錯誤? – edge2

回答

0

試試這個

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

這是寫的sql2008r2的方式 – Christian

+0

OP的語法問題的全部點是作爲變量傳遞在表中,你有它作爲一個文字。在你的代碼中,用'object_id = OBJECT_ID(N'[dbo]。['+ @ TableName + N']')替換'name LIKE'mytable'',然後它將在一個變量上工作。 –

1

提示:您可以隨時添加PRINT @ SQLSTMT查看您的過程生成的代碼。

有腳本的兩個錯誤,無論是在線路:

INSERT INTO dbo.NewTables ('[email protected]+N','[email protected]+N') Values('[email protected]+N','[email protected]+N') 

第一個錯誤:NewTables表必須有2列,以保持表名和文件名。讓我們COL_TBL給他們打電話,COL_FILE

二錯誤:你必須在聲明的價值部分添加引號

這是應該的樣子:

INSERT INTO dbo.NewTables (COL_TBL, COL_FILE) Values('''[email protected]+N''','''[email protected]+N''') 

順便說一句,你沒有貼碼完全地,末尾沒有END。請下一次複製整個代碼,以便其他人可以重現錯誤。

編輯:請考慮以下幾點:使用sp_executesql代替EXEC,以避免SQL注入漏洞,不要串聯參數爲動態SQL和最終檢查表截斷它