2010-02-19 20 views
5

यह कैसे एसक्यूएल (एमएस एसक्यूएल) में प्राप्त किया जा सकताकोई डेटा के साथ एक और तालिका की संरचना से तालिका का निर्माण

धन्यवाद

ठीक: चलो मुझे स्पष्ट क्या हासिल करने के साथ गतिशील चयन बयान पैदा कर रहा है कोशिश कर रहा हूँ थोड़ा निकास खंड

जैसे: चयन col1, col2, चयन col1, col2, @table

से col2 तो मेरे resultset मैं चाहता हूँ @table

आगे नीचे के आधार पर हमेशा अलग हो जाएगा छोड़कर @table से col3

- इस @table ((ऊपर बनाई गई) चयन col1, col2 temptable से) के रूप में filteredData साथ

CTE

में उपयोग करने के लिए 10 नीचे

कोड अब तक है:

DECLARE @TABLENAME VARCHAR(200) = 'SERVICE_DELIVERY_LOCATION'; 
DECLARE @COLCOUNT INT ; 
DECLARE @TEMPCOLNAME VARCHAR(500) ; 
DECLARE @SELECTCOLUMNS VARCHAR(5000)=''; 
DECLARE @EXCEPTSTATEMENT VARCHAR(5000)='' ; 

--------------------------------------------------------------------------------------------------- 
--CASE: GET COMMON_COLUMNS COLUMNS OF SOURCE AND DESTINATION TABLE 
--------------------------------------------------------------------------------------------------- 
DECLARE @COMMON_COLUMNS TABLE(COLUMN_NAME VARCHAR(500)) 
INSERT INTO @COMMON_COLUMNS 
    SELECT SOURCE.COLUMN_NAME FROM SCD_SOURCE.INFORMATION_SCHEMA.COLUMNS SOURCE 
    INNER JOIN SCD_DESTI.INFORMATION_SCHEMA.COLUMNS DESTI ON SOURCE.COLUMN_NAME = DESTI.COLUMN_NAME 


--------------------------------------------------------------------------------------------------- 
--CASE: GET PK COLUMNS OF SOURCE TO MAP TO DESTINATION IN CASE WHERE NEED TO DO UPDATES 
--------------------------------------------------------------------------------------------------- 
DECLARE @PK_COLUMNS TABLE (PK_COLUMN VARCHAR(500)) 
INSERT INTO @PK_COLUMNS 
    SELECT KCU.COLUMN_NAME 
    FROM SCD_SOURCE.INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS TC 
    JOIN SCD_SOURCE.INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS KCU ON KCU.CONSTRAINT_SCHEMA = TC.CONSTRAINT_SCHEMA 
     AND KCU.CONSTRAINT_NAME = TC.CONSTRAINT_NAME 
     AND KCU.TABLE_SCHEMA = TC.TABLE_SCHEMA 
     AND KCU.TABLE_NAME = TC.TABLE_NAME 
     AND KCU.COLUMN_NAME != 'CREATE_DATA_CONTAINER_ID' 
    WHERE TC.CONSTRAINT_TYPE IN ('PRIMARY KEY') 


SELECT @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS 

WHILE (@COLCOUNT != 0) 
    BEGIN 
     SET @TEMPCOLNAME = (SELECT TOP 1 COLUMN_NAME FROM @COMMON_COLUMNS) 
     SET @SELECTCOLUMNS = @SELECTCOLUMNS + @TEMPCOLNAME + ', ' 
     DELETE FROM @COMMON_COLUMNS WHERE COLUMN_NAME = @TEMPCOLNAME 
     SELECT @COLCOUNT = COUNT(*) FROM @COMMON_COLUMNS 
    END 

SET @SELECTCOLUMNS = SUBSTRING(@SELECTCOLUMNS, 1, LEN(@SELECTCOLUMNS) - 1) 

SET @EXCEPTSTATEMENT = 'SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME 
EXEC(@EXCEPTSTATEMENT) 

temptable

धन्यवाद

+0

क्या किसी प्रोग्राम को एक ही स्कीमा के साथ नई टेबल बनाना है? यदि यह मानव एंथर्स द्वारा किया जाता है तो सही है। – awright18

उत्तर

1

मैंने पहले this answer/लिपि का उपयोग किया है।

7
SELECT TOP 0 * 
INTO NewTable 
FROM OriginalTable 

इस संरचना की प्रतिलिपि बनाएगा में अंतिम पंक्ति के resultset चाहते हैं, लेकिन बाधाओं आदि कॉपी नहीं करेंगे यदि आप सबकुछ चाहते हैं, तो सबसे अच्छी बात यह है कि एसएसएमएस से स्क्रिप्ट उत्पन्न करें और तालिका/बाधा/अनुक्रमणिका नाम बदलें।

संपादित करें: पुन:

आप के लिए पिछले 2 लाइनों को बदल सकता है "temptable में अंतिम पंक्ति के resultset चाहते हैं":

SET @EXCEPTSTATEMENT = 'SELECT * INTO MyNewTable FROM (SELECT ' + @SELECTCOLUMNS + ' FROM SCD_SOURCE.DBO.' + @TABLENAME + ' EXCEPT SELECT ' + @SELECTCOLUMNS + ' FROM SCD_DESTI.DBO.' + @TABLENAME + ') x' 
EXECUTE(@EXCEPTSTATEMENT) 

यह एक में resultset डाल " असली "टेबल; वैकल्पिक रूप से आपको एक वैश्विक अस्थायी तालिका का उपयोग करना होगा (केवल "MyTable" को "## MyTable" में बदलें)। यह एक स्थानीय अस्थायी तालिका ("#MyTable") के साथ काम नहीं करेगा क्योंकि इसका दायरा EXECUTE कथन के भीतर होगा यानी निष्पादन के बाद, आपके पास कोड नहीं हो सकता था जिसके बाद स्थानीय अस्थायी तालिका पूछेगी क्योंकि यह नहीं होगा उस दायरे में मौजूद है। इसलिए, इसे एक वास्तविक तालिका, या एक वैश्विक अस्थायी तालिका (जो वर्तमान दायरे के बाहर पहुंच योग्य होगी)/

+0

या पुराने_टेबल से चयन * के रूप में new_table बनाएं जहां 1 = 2 –

+2

@KMan, जो SQL सर्वर – AdaTheDev

+0

पर काम नहीं करता है, सुधार के लिए धन्यवाद, सटीक कथन इस प्रकार है: "OOTTable से MyNewTableName में चुनें * जहां 1 = 2;" - एसक्यूएल सर्वर 2005 पर कोशिश की और परीक्षण किया। बाधाओं के बिना स्कीमा कॉपी करता है। –

4

अपना मैनेजमेंट स्टूडियो खोलें, अपनी तालिका पर राइट क्लिक करें और>> नई क्वेरी विंडो बनाएं । यह अनुक्रमित की कमी आदि के साथ अपनी मेज की सटीक प्रतिलिपि बनाने के लिए क्वेरी उत्पन्न होगा ...

1
SELECT * 
INTO NewTable 
FROM OriginalTable 
WHERE 1 = 0 
संबंधित मुद्दे