2015-02-10 64 views
0

我想創建一個新的表與現有的表,其中表名應該從輸入參數傳遞。 我正在嘗試以下代碼。需要從現有表創建一個新表

DECLARE @oldTableName nvarchar(50) 
DECLARE @newStagingTableName nvarchar(50) 
SET @oldTableName='OldTableName' 
SET @newStagingTableName ='NewTableName'; 
SELECT * INTO @newStagingTableName FROM @oldTableName WHERE 1 = 0; 

SQL服務器在分析此查詢時發生錯誤。

+0

什麼錯誤? – 2015-02-10 12:10:36

+1

'@ newStagingTableNameFROM'這是一個錯字還是你沒有添加空格? – Kami 2015-02-10 12:11:43

+0

'@newStagingTableNameFROM'附近有錯誤的syntex,期望'。',ID或QUATED _ID。 – Diboliya 2015-02-10 12:12:50

回答

2

請問您可以嘗試下面的動態SQL查詢嗎?

DECLARE @oldTableName nvarchar(50) 
DECLARE @newStagingTableName nvarchar(50) 

SET @oldTableName='OldTableName' 
SET @newStagingTableName ='NewTableName' 

DECLARE @sqlquery nvarchar(100) = 'SELECT * INTO ' + @newStagingTableName + ' FROM ' + @oldTableName 
exec(@sqlquery) 
+0

此查詢正在工作。 – 2015-02-10 12:34:04

+0

使用QUOTENAME包裝這兩個表變量將大大減少SQL注入的時間。 – 2015-02-10 14:19:21

0

上線

SELECT * INTO @newStagingTableNameFROM @oldTableName WHERE 1 = 0; 

你沒有@newStagingTableName之間和FROM

也檢查不表NewTableName存在的空間?如果是這樣,你不能直接通過參數訪問它 - 你需要使用動態SQL - 也許this可以幫助

0

嘗試用這種

DECLARE @oldTableName NVARCHAR(50) 
DECLARE @newStagingTableName NVARCHAR(50), 
     @sql     NVARCHAR(100)='' 

SET @oldTableName='' 
SET @newStagingTableName =''; 
SET @sql='select * INTO ' + @newStagingTableName 
     + ' FROM ' + @oldTableName + ' WHERE 1 = 0;' 

EXEC sp_executesql 
    @sql 
0

這應該工作。 。 。

DECLARE @oldTableName nvarchar(50) 
DECLARE @newStagingTableName nvarchar(50) 
declare @sql nvarchar(max); 
SET @oldTableName='oldTableName' 
SET @newStagingTableName ='newStagingTableName '; 

SET @sql='SELECT * INTO ' + @newStagingTableName + ' FROM ' + @oldTableName + ' WHERE 1 = 0;' 

exec sp_executesql @sql 

編輯:對不起,我沒有看到其他人的答案是