2013-05-16 36 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与您使用的格式无法正确结合。