2013-11-01 100 views
1

我已經做了一些調試我的SQL,我不能找出我得到的瘋狂錯誤,我已經縮小到幾行,我不能看到問題是什麼,請有人給我一些幫助。']'附近的語法不正確。

我得到這個錯誤

我here2 消息102,級別15,狀態1,線附近 1級 不正確的語法 ']'。 我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' 
+2

而不是隻是一味地'你是什麼就生產什麼SQL EXEC'ing,你可以將其更改爲'PRINT'而不是和*見*您試圖什麼SQL跑。這會比調整,運行代碼,發生錯誤,發佈到SO,然後希望有人能夠在不看到SQL的情況下診斷問題更快。即使你自己不能解決它,能夠顯示你所產生的SQL應該讓反饋更快。 –

回答

7

你在這裏缺少一個左括號:

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

而且我建議你改用the QuoteName() function代替:

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

+1爲QuoteName()學到了新的東西! – Ric

+0

我的代碼如何用開放式方括號Im來確定它可能走到哪裏 – user2520671

+0

我建議不要使用它們,而是切換到QuoteName()函數。我已經向你指出了正確的方向,但我並沒有把答案放在你的盤子上。沒有嘗試就不會學習! – gvee

0

你缺少有關3個開口括號,據我所知可以在

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

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

+ ') SELECT ' + @cols2 + ']' -- -> either ') SELECT [' + @cols2 + ']' or ') SELECT (' + @cols2 + ')' 
0
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) 

編輯

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 

你需要改變你,你有後@sql聲明使用了QOUTENAME函數,因爲它爲您添加了方形背景,因此您無需在Sql語句中對方形背景進行聯合。

結果

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

對不起,我得到更多的錯誤使用此 – user2520671

+0

什麼是錯誤信息? –

+0

Msg 2812,Level 16,State 62,Line 56 找不到存儲過程「'。 Msg 102,Level 15,State 1,Line 1 ']'附近語法不正確。 消息1038,級別15,狀態4,行1 對象或列名缺失或爲空。對於SELECT INTO語句,請確認每列都有一個名稱。對於其他語句,查找空的別名。別名定義爲「」或[]是不允許的。將別名更改爲有效的名稱。 消息2812,級別16,狀態62,行59 找不到存儲過程'c365online_script1'。 – user2520671