2013-10-30 74 views
0

我試圖聲明一個表變量,然後將它加入到我在數據庫中創建的表中。每次嘗試將我的「NAME」字段插入到我的表中時,即使GNAME字段正常工作,我也會收到錯誤「Invalid Column Name "NAME"」。我在做什麼錯了,我該如何加入我NAME專欄?當從表變量中使用列時出現「無效列」

DECLARE @Names TABLE 
(
    ID INT, 
    NAME VARCHAR(100), 
    GNAME VARCHAR(100) 
) 

INSERT INTO @Names 
(
    ID, 
    NAME, 
    GNAME 
) 

SELECT 
    CName.ID, 
    Ref.NAME, 
    Ref.GNAME 
FROM 
    @CurrentPositions AS CName 
LEFT OUTER JOIN 
    dbo.NameField AS Ref 
ON 
    CName.ID = Ref.ID 

    IF (OBJECT_ID('dbo.ReportTable', 'U') IS NOT NULL) 
    DROP TABLE dbo.ReportTable 

CREATE TABLE [dbo].[ReportTable] 
(
    [ID_NUMBER] [INT], 
    [NAME] [VARCHAR](150) 
    [GNAME] [VARCHAR](150) 
) 

INSERT INTO [dbo].[ReportTable] 
(
    ID_NUMBER, 
    NAME, 
    GNAME 
) 

SELECT 
    C.ID_NUMBER, 
    N.NAME, 
    N.GNAME 
FROM 
    @Names AS N 
INNER JOIN 
    @CurrentPositions AS C 
ON N.ID_NUMBER = C.ID_NUMBER 
+1

不能使用諸如@names或@ CurrentPositions之類的變量作爲表名,而無需構建動態SQL,這會打開SQL注入/風險的大門。 SQL不直接支持表名作爲變量,除非你使用動態SQL(寫出一個字符串然後執行SQL) – xQbert

回答

1

嘗試使用TEMP表

CREATE TABLE #Names 
(
    ID INT, 
    NAME VARCHAR(100), 
    GNAME VARCHAR(100) 
) 

INSERT INTO #Names 
(
    ID, 
    NAME, 
    GNAME 
) 
SELECT 
    CName.ID, 
    Ref.NAME, 
    Ref.GNAME 
FROM 
    #CurrentPositions AS CName 
LEFT OUTER JOIN 
    dbo.NameField AS Ref 
ON 
    CName.ID = Ref.ID 

    IF (OBJECT_ID('dbo.ReportTable', 'U') IS NOT NULL) 
    DROP TABLE dbo.ReportTable 

CREATE TABLE [dbo].[ReportTable] 
(
    [ID_NUMBER] [INT], 
    [NAME] [VARCHAR](150) 
    [GNAME] [VARCHAR](150) 
) 

INSERT INTO [dbo].[ReportTable] 
(
    ID_NUMBER, 
    NAME, 
    GNAME 
) 

SELECT 
    C.ID_NUMBER, 
    N.NAME, 
    N.GNAME 
FROM 
    #Names AS N 
INNER JOIN 
    #CurrentPositions AS C 
ON N.ID_NUMBER = C.ID_NUMBER 

我假定你也將發生變化表變量@CurrentPositions到一個臨時表

只記得之後下降表你使用它們。

+0

臨時表修復了這個問題!謝謝! – user2934274

0

很可能您需要做的就是將您的字段名稱放在方括號中,例如,

INSERT INTO @Names 
(
    [ID], 
    [NAME], 
    [GNAME] 
) 

SELECT 
    CName.[ID], 
    Ref.[NAME], 
    Ref.[GNAME] 
FROM 
    @CurrentPositions AS CName 
LEFT OUTER JOIN 
    dbo.NameField AS Ref 
ON 
    CName.[ID] = Ref.[ID] 

如果仍不能解決問題,請發表您的@CurrentPositionsdbo.NameField表的模式。

相關問題