2010-05-15 12 views
106

के रूप में मैं इस क्वेरी निष्पादित करने के लिए कोशिश कर रहा हूँ:तालिका नाम चर

declare @tablename varchar(50) 
set @tablename = 'test' 
select * from @tablename 

यह निम्न त्रुटि पैदा करता है:

Msg 1087, Level 16, State 1, Line 5

Must declare the table variable "@tablename".

सही तरीके से तालिका नाम डायनामिक रूप से की है, क्या है?

उत्तर

91

तालिका नाम और स्तंभ नाम, स्थिर होने के लिए करता है, तो क्वेरी स्थिर है की जरूरत है। गतिशील तालिका या कॉलम नामों के लिए, आपको पूर्ण SQL गतिशील रूप से जेनरेट करना चाहिए, और इसे निष्पादित करने के लिए sp_executesql का उपयोग करना चाहिए।

अधिक यहाँ विवरण: The curse and blessings of dynamic SQL

31

आप एक चर के लिए एक मेज नाम का उपयोग नहीं कर सकते हैं, आप के बजाय यह करने के लिए होगा:

DECLARE @sqlCommand varchar(1000) 
SET @sqlCommand = 'SELECT * from yourtable' 
EXEC (@sqlCommand) 
9

आप गतिशील एसक्यूएल उत्पन्न करने के लिए की आवश्यकता होगी:

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500) 

set @sql = 'select * from ' + @tablename 

exec (@sql) 
59

यह करने के लिए अपने पिछले बयान बदलें:

EXEC('SELECT * FROM ' + @tablename) 

यह मैं कैसे मेरा करना है एक संग्रहीत प्रक्रिया में। पहला ब्लॉक वैरिएबल घोषित करेगा, और इस मामले में TEST_2012OCTOBER में वर्तमान वर्ष और महीने के नाम के आधार पर तालिका का नाम सेट करेगा। मैं फिर जांचता हूं कि यह डीबी में पहले से मौजूद है या नहीं, और अगर यह करता है तो हटा दें। फिर अगला ब्लॉक टेबल बनाने के लिए स्टेटमेंट में एक चयन का उपयोग करेगा और पैरामीटर के साथ किसी अन्य तालिका से रिकॉर्ड के साथ इसे पॉप्युलेट करेगा। एक जवाब के लिए

--DECLARE TABLE NAME VARIABLE DYNAMICALLY 
DECLARE @table_name varchar(max) 
SET @table_name = 
    (SELECT 'TEST_' 
      + DATENAME(YEAR,GETDATE()) 
      + UPPER(DATENAME(MONTH,GETDATE()))) 

--DROP THE TABLE IF IT ALREADY EXISTS 
IF EXISTS(SELECT name 
      FROM sysobjects 
      WHERE name = @table_name AND xtype = 'U') 

BEGIN 
    EXEC('drop table ' + @table_name) 
END 

--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE 
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''') 
26

थोड़ी देर हो चुकी है, लेकिन किसी और बाहर की मदद करनी चाहिए:

CREATE PROCEDURE [dbo].[GetByName] 
    @TableName NVARCHAR(100) 
    AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 
    DECLARE @sSQL nvarchar(500); 

    SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName); 

    EXEC sp_executesql @sSQL 



END 
+6

QUOTENAME सुरक्षा के लिए महत्वपूर्ण है डाल दिया। धन्यवाद। –

+0

लेकिन ऐसी क्वेरी से मूल्य कैसे वापस करें? जैसे 'COUNT (*)'? – Suncatcher

-1
Declare @fs_e int, @C_Tables CURSOR, @Table varchar(50) 

SET @C_Tables = CURSOR FOR 
     select name from sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 AND name like 'TR_%' 
OPEN @C_Tables 
FETCH @C_Tables INTO @Table 
    SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables' 

WHILE (@fs_e <> -1) 
    BEGIN 
     exec('Select * from '+ @Table) 
     FETCH @C_Tables INTO @Table 
     SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables' 
    END 
1
DECLARE @tbl sysname, 
     @sql nvarchar(4000), 
     @params nvarchar(4000), 
     @count int 

DECLARE tblcur CURSOR STATIC LOCAL FOR 
    SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated' 
    ORDER BY 1 
OPEN tblcur 

WHILE 1 = 1 
BEGIN 
    FETCH tblcur INTO @tbl 
    IF @@fetch_status <> 0 
     BREAK 

    SELECT @sql = 
    N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) + 
    N' WHERE LastUpdated BETWEEN @fromdate AND ' + 
    N'       coalesce(@todate, ''99991231'')' 
    SELECT @params = N'@fromdate datetime, ' + 
        N'@todate datetime = NULL, ' + 
        N'@cnt  int  OUTPUT' 
    EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT 

    PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.' 
END 

DEALLOCATE tblcur 

मैं लाइनों है कि पी

+0

इस पोस्ट को संपादित करने की आवश्यकता है, और कुछ स्पष्टीकरण की आवश्यकता हो सकती है .. –

संबंधित मुद्दे