Incorrect syntax near ']'.?

2019-02-20 12:32发布

问题:

I have done some debugging on my sql and I cant figure out the maddening error I am getting I have narrowed it down to a couple of lines which I cant see what the problem is, please someone give me some assistance.

I get this error

I am here2 Msg 102, Level 15, State 1, Line 1 Incorrect syntax near ']'. I am here3

 Print 'I am here2'
                        SET IDENTITY_INSERT c365online_script1.dbo.tCompany ON
                        declare @cols2 varchar(max)
                        select @cols2 = (Select Stuff((Select '],[' + C.COLUMN_NAME From INFORMATION_SCHEMA.COLUMNS As C Where C.TABLE_SCHEMA = T.TABLE_SCHEMA And C.TABLE_NAME = T.TABLE_NAME Order By C.ORDINAL_POSITION For Xml Path('')), 1, 2, '') As Columns From INFORMATION_SCHEMA.TABLES As T WHERE T.TABLE_NAME = @tablename)
                        EXEC('INSERT INTO [' + @Destination_Database_Name + '].[dbo].[' + @tablename + '] (' + @cols2 + ']' + ') SELECT ' + @cols2 + ']' + ' FROM [' + @Source_Database_Name + '].[dbo].[' + @tablename + ']');
                         Print 'I am here3'

回答1:

You're missing an opening square bracket here:

... ') SELECT ' + @cols2 + ']' + ' FROM ...

Furthermore I would recommend you switch to using the QuoteName() function instead:

... ') SELECT ' + QuoteName(@cols2) + ' FROM...


回答2:

You are missing about 3 opening brackets as far as i can tell at

select @cols2 = (Select Stuff((Select '],[ 

and

 (' + @cols2 + ']' // -> either [' + @cols2 + ']' or (' + @cols2 + ')'

and

 + ') SELECT ' + @cols2 + ']'  -- -> either ') SELECT [' + @cols2 + ']'  or ') SELECT (' + @cols2 + ')' 


回答3:

declare @cols2 nvarchar(max)
select @cols2 = (Select Stuff((Select ',[' + C.COLUMN_NAME  + ']'
                From INFORMATION_SCHEMA.COLUMNS As C 
                Where C.TABLE_SCHEMA = T.TABLE_SCHEMA 
                And C.TABLE_NAME = T.TABLE_NAME 
                Order By C.ORDINAL_POSITION For Xml Path('')), 1, 1, '') As Columns 
                From INFORMATION_SCHEMA.TABLES As T 
                WHERE T.TABLE_NAME = @tablename)

Edit

DECLARE @Destination_Database_Name NVARCHAR(128) = 'Trg_DataBaseName'
DECLARE @tablename NVARCHAR(128) = 'AgressoIFCGLItems'
DECLARE   @Source_Database_Name NVARCHAR(128) = 'Configsandpit'

Print 'I am here2'

--SET IDENTITY_INSERT c365online_script1.dbo.tCompany ON
declare @cols2 varchar(max)
select @cols2 = (Select Stuff((Select  ',' + QUOTENAME(C.COLUMN_NAME)  [text()]
                From INFORMATION_SCHEMA.COLUMNS As C 
                Where C.TABLE_SCHEMA = T.TABLE_SCHEMA 
                And C.TABLE_NAME = T.TABLE_NAME 
                Order By C.ORDINAL_POSITION For Xml Path('')), 1, 1, '') As Columns 
                From INFORMATION_SCHEMA.TABLES As T 
                WHERE T.TABLE_NAME = @tablename)
DECLARE @sql NVARCHAR(MAX) 
SET @sql = 'INSERT INTO ' + QUOTENAME(@Destination_Database_Name) + '.[dbo].' + QUOTENAME(@tablename) + ' (' + @cols2 +   ') SELECT ' + @cols2  + ' FROM ' + QUOTENAME(@Source_Database_Name) + '.[dbo].' + QUOTENAME(@tablename) + '';

EXECUTE sp_Executesql @sql 

Your need to change you @Sql Statement after you have used QOUTENAME function as it adds the square backets for you, you do not need to concatinate square barckets in your Sql statement.

Result

INSERT INTO [Trg_DataBaseName].[dbo].[TableName] ([Col1],[Col2],[Col3],[Col4],[Col5]) SELECT [Col1],[Col2],[Col3],[Col4],[Col5] FROM [Src_Database].[dbo].[TableName]