简体   繁体   English

Python SQL Server - 从现有表中的值创建表

[英]Python SQL Server - Create Table from Values from an existing Table

i'm looking for a solution how to create a table from this data (which is located on a table in a sql database with the name "table1") with python or sql我正在寻找一种解决方案,如何使用 python 或 sql 从此数据(位于 sql 数据库中名为“table1”的表上)创建一个表

tablename表名 column柱子 datatype数据类型 length长度
a一个 1 1 varchar varchar 5 5
a一个 2 2 date日期 0 0
a一个 3 3 float漂浮 0 0
b b 1 1 varchar varchar 10 10
b b 2 2 varchar varchar 8 8
b b 3 3 float漂浮 0 0
b b 4 4 varchar varchar 50 50
c C 1 1 date日期 0 0
c C 2 2 varchar varchar 6 6

goal is to create tables (a,b,c)目标是创建表(a,b,c)

their columns and their datatype can also be found in the same table它们的列和它们的数据类型也可以在同一个表中找到

the tricky part is, that the values of "table1" will always be different(dynamic tablenames, columnnames, datatype and length), so i need to write a code, that can reference the values in "table1" and create all tables with their columns (+datatype) found in "table1"棘手的部分是,“table1”的值总是不同的(动态表名、列名、数据类型和长度),所以我需要编写一个代码,它可以引用“table1”中的值并使用它们创建所有表在“table1”中找到的列(+数据类型)

i got this already我已经知道了

DECLARE @n INT = (SELECT COUNT(DISTINCT TABNAME) FROM dbo.Tablenames),
    @i INT = '1',
    @query VARCHAR(4000)

WHILE @n >= @i
BEGIN
DECLARE @tablename VARCHAR(255) = (Select Top 1 TABNAME FROM 
dbo.Tablenames),
        @columnname VARCHAR(255), --not properly declared
        @datatype VARCHAR(255),   --not properly declared
        @length VARCHAR(255)      --not properly declared
SELECT TOP 1 @tablename
FROM dbo.Tablenames
SET @query = N'CREATE TABLE' + QUOTENAME(@tablename) + 
    '(' +
    @columnname + @datatype + '(' + @length + ')' --this part needs if statement (if not varchar = no '+ '(' + @length + ')''
    + ')'  
EXEC (@query)

SET @i+=1

DELETE FROM dbo.Tablenames
WHERE TABNAME = @tableName
END

thanks in advance提前致谢

You can use dynamic SQL for this.您可以为此使用动态 SQL。

You simply aggregate the whole thing using STRING_AGG .您只需使用STRING_AGG聚合整个内容。 You need two levels of aggregation, once for the columns, then again for the tables.您需要两个级别的聚合,一次用于列,然后再次用于表。 This gives you one big script you can execute.这为您提供了一个可以执行的大脚本。

DECLARE @sql nvarchar(max) = (
    SELECT STRING_AGG(CONCAT(
      'CREATE TABLE ',
      QUOTENAME(t1.tablename),
      ' (
',
      t1.columns,
      '
);'
    ), '
')
    FROM (
        SELECT
          t1.tablename,
          columns = STRING_AGG(CAST(CONCAT(
            '  ',
            QUOTENAME(t1.[column]),
            ' ',
            t1.datatype,
            CASE WHEN t1.datatype = 'varchar' THEN CONCAT('(', t1.length, ')') END
          ) AS nvarchar(max)), ',
')
        FROM table1 t1
        GROUP BY
          t1.tablename
    ) t1
);

PRINT @sql;

EXEC sp_executesql @sql;

db<>fiddle db<>小提琴

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM