2016-02-18 23 views
5

Tôi đang làm việc trên truy vấn sao chép cấu trúc bảng từ máy chủ được liên kết vào cơ sở dữ liệu cục bộ để có danh sách chung các bảng.Thay đổi kiểu dữ liệu trong bảng mới khi sử dụng SELECT * INTO

Tuy nhiên vì lý do nào đó, các loại dữ liệu thập phân đang được thay đổi thành số. Điều này dường như chỉ xảy ra khi chọn vào các máy chủ được liên kết. Tuy nhiên khi cố gắng tương tự trên hệ thống cục bộ của tôi, tôi không thể tái tạo vấn đề.

Môi trường nơi lỗi này xảy ra phiên bản SQL của máy chủ cục bộ và được liên kết khác nhau (10, 12 tương ứng). Không chắc chắn nếu đó là liên quan.

Nếu ai đó có thể làm sáng tỏ điều này, nó sẽ được đánh giá cao. Cảm ơn.

Truy vấn là theo dưới đây:

WHILE (select count(*) from @tbls) > 0 
BEGIN 
    SELECT @id = 0, @tblname = '', @cols = '', @colSets = '' 
    select top 1 @id = ID, @tblname = TableName, @PKField = PKField, @DataType = DataType from @tbls  

    if exists (select 1 from sys.tables where name = @tblname) 
    begin 
     delete from @tbls where ID = @id 
     Continue; 
    end 

    exec('select * into '+ @tblname +' from [linkedserver].MyDatabase.dbo.'[email protected] + ' where 1 = 0') 

    delete from @tbls where ID = @id 
END 
+2

Trong máy chủ của bạn, SqlServer biết rằng các bộ ký tự và định dạng giống nhau. Vì vậy, nó bảo tồn nguồn. Giữa các máy chủ khác nhau, nó thường sẽ ngầm đúc tất cả các kiểu dữ liệu tới mẫu số chung cao nhất cho mỗi kiểu dữ liệu. Vì bạn chỉ đang cố tạo một bảng không có dữ liệu, hãy xem chủ đề này http://stackoverflow.com/questions/21547/in-sql-server-how-do-i-generate-a-create-table-statement- for-a-given-table –

+0

Trùng lặp có thể xảy ra của http://stackoverflow.com/questions/33513776/sql-auto-converts-decimal-to-numeric-when-select-insert –

+0

@AndreeaDumitru Nó có thể là một bản sao, nhưng một câu trả lời không trả lời nó thực sự. Không phải là câu trả lời được chấp nhận ... –

Trả lời

1

tôi giải quyết vấn đề của tôi tôi cập nhật bàn các numerics để thập phân sau khi chọn vào sử dụng dưới đây:

declare @lst table (Query varchar(300)) 

    insert into @lst 
    select 'ALTER TABLE '+ TABLE_NAME + ' ALTER COLUMN '+ column_name +' '+ 
       'decimal' + '('+ cast(NUMERIC_PRECISION as varchar(20)) +','+ cast(NUMERIC_SCALE as varchar(20)) +')' as DataType 
    from information_schema.COLUMNS 
    where TABLE_NAME = 'Table_Name' and DATA_TYPE = 'numeric' 

    while ((select count(*) from @lst) > 0) 
    begin 
     declare @s varchar(300) 
     set @s = (select top 1 query from @lst) 
     exec (@s) 
     delete from @lst where query = @s 
    end 

Cảm ơn những người trả lời.

1

NUMERICDECIMAL là hoán đổi cho nhau. Nhưng nếu điều này gây ra vấn đề, chìa khóa có thể là để thay đổi các cột sau khi bảng được tạo ra. Làm nó tự động có thể giống như thế:

-- Declare a dynamic SQL variable 
DECLARE @sql VARCHAR(max) 

WHILE (select count(*) from @tbls) > 0 
BEGIN 
    SELECT @id = 0, @tblname = '', @cols = '', @colSets = '' 
    select top 1 @id = ID, @tblname = TableName, @PKField = PKField, @DataType = DataType from @tbls  

    if exists (select 1 from sys.tables where name = @tblname) 
    begin 
     delete from @tbls where ID = @id 
     Continue; 
    end 

    exec('select * into '+ @tblname +' from [linkedserver].MyDatabase.dbo.'[email protected] + ' where 1 = 0') 

    -- After table creation, use row-wise concatenation to create ALTER TABLE statements 
    -- Change all numeric to decimal 
    SELECT @sql = STUFF((SELECT CHAR(13) + CHAR(10) 
           + CONCAT('ALTER TABLE ALTER COLUMN ', [COLUMN_NAME], ' DECIMAL ', 
            '(' + CAST([numeric_precision] AS VARCHAR) + ', ' + CAST([numeric_scale] AS VARCHAR) + ');') 
         FROM information_schema.columns c 
         WHERE t.[TABLE_NAME] = c.[TABLE_NAME] 
           AND c.[DATA_TYPE] = 'numeric' 
         ORDER BY c.[COLUMN_NAME] 
         FOR xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') 
    FROM information_schema.tables t 
    WHERE t.[TABLE_NAME] = @tblname 

    -- Run dynamic SQL statement (will sometimes be NULL, which is fine) 
    EXEC(@sql) 

    delete from @tbls where ID = @id 
END 

này sẽ thay đổi tất cả NUMERIC để DECIMAL - mà có thể không được những gì bạn muốn. Nếu đúng như vậy, bạn có thể phải xem xét tạo câu lệnh động CREATE TABLE.

Các vấn đề liên quan