2013-05-16 32 views
0

我有嘗試執行存儲過程的問題..執行存儲過程的問題?

USE [OPPY_DWUSD] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[truncate_non_empty_table] 
     @TableToTruncate = '[fact].[SALES]' 

SELECT 'Return Value' = @return_value 

GO 

在上面的例子TSQL,我不斷收到這個錯誤..

消息105,15級,狀態1,第1行
字符串'SALES]'後面未加上引號。
Msg 102,Level 15,State 1,Line 1
'SALES]'附近的語法錯誤。

不知道我在做什麼錯?我也嘗試過N'fact.SALES',但沒有奏效。

我試圖傳入TableToTruncate的表稱爲「fact.SALES」。

作爲模式的「事實」。

有關如何解決此問題的任何想法?

謝謝。

這裏是SP:

CREATE PROCEDURE [dbo].[truncate_non_empty_table] 

    @TableToTruncate     VARCHAR(64) 

AS 

BEGIN 

SET NOCOUNT ON 

-- GLOBAL VARIABLES 
DECLARE @i int 
DECLARE @Debug bit 
DECLARE @Recycle bit 
DECLARE @Verbose bit 
DECLARE @TableName varchar(80) 
DECLARE @ColumnName varchar(80) 
DECLARE @ReferencedTableName varchar(80) 
DECLARE @ReferencedColumnName varchar(80) 
DECLARE @ConstraintName varchar(250) 

DECLARE @CreateStatement varchar(max) 
DECLARE @DropStatement varchar(max) 
DECLARE @TruncateStatement varchar(max) 
DECLARE @CreateStatementTemp varchar(max) 
DECLARE @DropStatementTemp varchar(max) 
DECLARE @TruncateStatementTemp varchar(max) 
DECLARE @Statement varchar(max) 

     -- 1 = Will not execute statements 
SET @Debug = 0 
     -- 0 = Will not create or truncate storage table 
     -- 1 = Will create or truncate storage table 
SET @Recycle = 0 
     -- 1 = Will print a message on every step 
set @Verbose = 1 

SET @i = 1 
    SET @CreateStatement = 'ALTER TABLE [dbo].[<tablename>] WITH NOCHECK ADD CONSTRAINT [<constraintname>] FOREIGN KEY([<column>]) REFERENCES [dbo].[<reftable>] ([<refcolumn>])' 
    SET @DropStatement = 'ALTER TABLE [dbo].[<tablename>] DROP CONSTRAINT [<constraintname>]' 
    SET @TruncateStatement = 'TRUNCATE TABLE [<tablename>]' 

-- Drop Temporary tables 

IF OBJECT_ID('tempdb..#FKs') IS NOT NULL 
    DROP TABLE #FKs 

-- GET FKs 
SELECT ROW_NUMBER() OVER (ORDER BY OBJECT_NAME(parent_object_id), clm1.name) as ID, 
     OBJECT_NAME(constraint_object_id) as ConstraintName, 
     OBJECT_NAME(parent_object_id) as TableName, 
     clm1.name as ColumnName, 
     OBJECT_NAME(referenced_object_id) as ReferencedTableName, 
     clm2.name as ReferencedColumnName 
    INTO #FKs 
    FROM sys.foreign_key_columns fk 
     JOIN sys.columns clm1 
     ON fk.parent_column_id = clm1.column_id 
      AND fk.parent_object_id = clm1.object_id 
     JOIN sys.columns clm2 
     ON fk.referenced_column_id = clm2.column_id 
      AND fk.referenced_object_id= clm2.object_id 
--WHERE OBJECT_NAME(parent_object_id) not in ('//tables that you do not wont to be truncated') 
WHERE OBJECT_NAME(referenced_object_id) = @TableToTruncate 
ORDER BY OBJECT_NAME(parent_object_id) 


-- Prepare Storage Table 
IF Not EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'Internal_FK_Definition_Storage') 
    BEGIN 
     IF @Verbose = 1 
    PRINT '1. Creating Process Specific Tables...' 

    -- CREATE STORAGE TABLE IF IT DOES NOT EXISTS 
    CREATE TABLE [Internal_FK_Definition_Storage] 
    (
    ID int not null identity(1,1) primary key, 
    FK_Name varchar(250) not null, 
    FK_CreationStatement varchar(max) not null, 
    FK_DestructionStatement varchar(max) not null, 
    Table_TruncationStatement varchar(max) not null 
) 
    END 
ELSE 
    BEGIN 
     IF @Recycle = 0 
      BEGIN 
       IF @Verbose = 1 
     PRINT '1. Truncating Process Specific Tables...' 

    -- TRUNCATE TABLE IF IT ALREADY EXISTS 
    TRUNCATE TABLE [Internal_FK_Definition_Storage]  
     END 
     ELSE 
     PRINT '1. Process specific table will be recycled from previous execution...' 
    END 


IF @Recycle = 0 
    BEGIN 

    IF @Verbose = 1 
    PRINT '2. Backing up Foreign Key Definitions...' 

    -- Fetch and persist FKs    
    WHILE (@i <= (SELECT MAX(ID) FROM #FKs)) 
    BEGIN 
    SET @ConstraintName = (SELECT ConstraintName FROM #FKs WHERE ID = @i) 
    SET @TableName = (SELECT TableName FROM #FKs WHERE ID = @i) 
    SET @ColumnName = (SELECT ColumnName FROM #FKs WHERE ID = @i) 
    SET @ReferencedTableName = (SELECT ReferencedTableName FROM #FKs WHERE ID = @i) 
    SET @ReferencedColumnName = (SELECT ReferencedColumnName FROM #FKs WHERE ID = @i) 

    SET @DropStatementTemp = REPLACE(REPLACE(@DropStatement,'<tablename>',@TableName),'<constraintname>',@ConstraintName) 
    SET @CreateStatementTemp = REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@CreateStatement,'<tablename>',@TableName),'<column>',@ColumnName),'<constraintname>',@ConstraintName),'<reftable>',@ReferencedTableName),'<refcolumn>',@ReferencedColumnName) 
    SET @TruncateStatementTemp = REPLACE(@TruncateStatement,'<tablename>',@TableName) 

    INSERT INTO [Internal_FK_Definition_Storage] 
         SELECT @ConstraintName, @CreateStatementTemp, @DropStatementTemp, @TruncateStatementTemp 

    SET @i = @i + 1 

    IF @Verbose = 1 
     PRINT ' > Backing up [' + @ConstraintName + '] from [' + @TableName + ']' 

    END 
    END 
    ELSE 
     PRINT '2. Backup up was recycled from previous execution...' 

     IF @Verbose = 1 
    PRINT '3. Dropping Foreign Keys...' 

    -- DROP FOREING KEYS 
    SET @i = 1 
    WHILE (@i <= (SELECT MAX(ID) FROM [Internal_FK_Definition_Storage])) 
      BEGIN 
      SET @ConstraintName = (SELECT FK_Name FROM [Internal_FK_Definition_Storage] WHERE ID = @i) 
    SET @Statement = (SELECT FK_DestructionStatement FROM [Internal_FK_Definition_Storage] WITH (NOLOCK) WHERE ID = @i) 

    IF @Debug = 1 
     PRINT @Statement 
    ELSE 
     EXEC(@Statement) 

    SET @i = @i + 1 


    IF @Verbose = 1 
     PRINT ' > Dropping [' + @ConstraintName + ']' 

      END  


    IF @Verbose = 1 
     PRINT '4. Truncating Tables...' 

    -- TRUNCATE TABLES   
    SET @i = 1 
    WHILE (@i <= (SELECT MAX(ID) FROM [Internal_FK_Definition_Storage])) 
      BEGIN 

    SET @Statement = (SELECT Table_TruncationStatement FROM [Internal_FK_Definition_Storage] WHERE ID = @i) 

    IF @Debug = 1 
     PRINT @Statement 
    ELSE 
     EXEC(@Statement) 

    SET @i = @i + 1 

    IF @Verbose = 1 
     PRINT ' > ' + @Statement 
      END 

    IF @Verbose = 1 
     PRINT ' > TRUNCATE TABLE [' + @TableToTruncate + ']' 

    IF @Debug = 1 
     PRINT 'TRUNCATE TABLE [' + @TableToTruncate + ']' 
    ELSE 
     EXEC('TRUNCATE TABLE [' + @TableToTruncate + ']') 


    IF @Verbose = 1 
    PRINT '5. Re-creating Foreign Keys...' 

-- CREATE FOREING KEYS 
SET @i = 1 
WHILE (@i <= (SELECT MAX(ID) FROM [Internal_FK_Definition_Storage])) 
     BEGIN 
     SET @ConstraintName = (SELECT FK_Name FROM [Internal_FK_Definition_Storage] WHERE ID = @i) 
SET @Statement = (SELECT FK_CreationStatement FROM [Internal_FK_Definition_Storage] WHERE ID = @i) 

IF @Debug = 1 
    PRINT @Statement 
ELSE 
    EXEC(@Statement) 

SET @i = @i + 1 


IF @Verbose = 1 
    PRINT ' > Re-creating [' + @ConstraintName + ']' 

     END 

IF @Verbose = 1 
    PRINT '6. Process Completed' 

END

+0

我看到你有一些調試代碼打印您的動態SQL語句;你用它來一個一個地生成和測試它們嗎?有什麼東西在你的代碼,不喜歡錶名的格式,但它是一個大量的代碼爲別人挑選過了,既然你已經到位的調試代碼好像你應該能夠很容易地縮小這個下來。 – Pondlife

回答

1

需要一個逗號

USE [OPPY_DWUSD] 
GO 

DECLARE @return_value int 

EXEC @return_value = [dbo].[truncate_non_empty_table], -- <=== comma here 
     @TableToTruncate = '[fact].[SALES]' 

SELECT 'Return Value' = @return_value 

GO 

也,不知道,你可能需要指定@return_value爲Out參數

EXEC @return_value = [dbo].[truncate_non_empty_table] Out, -- <=== comma here and Out 
     @TableToTruncate = '[fact].[SALES]' 
+0

這並不會工作。消息102,級別15,狀態1,4號線 附近有語法錯誤「」。 – exxoid

0

T他的錯誤似乎來自Stored Proc內部。我假設在proc中發生了一些動態SQL,這些動態SQL與您使用的格式無法正確結合。