sql - 用于根据列类型插入默认值的存储过程

标签 sql sql-server azure t-sql stored-procedures

我试图弄清楚如何创建一个存储过程,该过程将表作为输入,然后根据列类型在所有列中插入值。

例如:表Dim.Name有两列;第一个是ID这是一个 int第二个是Name其类型为 nvarchar :

<表类=“s-表”> <标题> ID(整数) 名称(nvarchar) <正文>

我试图弄清楚如何创建一个存储过程,它将表作为输入并为所有 int 插入“-1”列和所有 nvarchar 的“未知”列。

所以想要的结果是

dbo.usp_InsertData(Dim.Name)
<表类=“s-表”> <标题> ID(整数) 名称(nvarchar) <正文> -1 未知

最佳答案

您可以使用sys.columns构建动态INSERT

究竟为什么你想要这样做是另一个问题。

CREATE OR ALTER PROCEDURE WeirdInsert
  @schema sysname,
  @table  sysname
AS

DECLARE @sql nvarchar(max) = (
    SELECT '
INSERT ' + QUOTENAME(@schema) + '.' + QUOTENAME(@table) + '
(' + STRING_AGG(QUOTENAME(c.name), ', ') + ')
VALUES (' + STRING_AGG(
      CASE WHEN c.system_type_id IN (34,35,99,167,167,175,231,239)
           THEN '''Unknown'''
           WHEN c.system_type_id IN (48,52,56,59,60,62,106,108,122,127)
           THEN '-1'
           ELSE 'DEFAULT'
      END , ', ')
      + ');'
    FROM sys.columns c
    JOIN sys.tables t ON t.object_id = c.object_id
    JOIN sys.schemas s ON s.schema_id = t.schema_id
    WHERE t.name = @table
      AND s.name = @schema
);

EXEC sp_executesql @sql;  -- can also pass parameters

SQL Fiddle

关于sql - 用于根据列类型插入默认值的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73079785/

相关文章:

sql - 不使用 CTE 的父子层次结构路径

c# - 如何将数据行流式传输到sql server?

sql - 如何将smalldatetime分解为年、月、日索引?

python - 如何使用 Python 从 Azure Functions 中的辅助线程重定向日志

sql - 如何在一个查询中显示与所有反馈相关的所有标签

java - Jooq代码生成器警告 'ignroing foreign key'

c# - Entity Framework 两个查询结果相同,但一个更快

azure - 从正在运行的函数应用程序中查找 Azure 应用程序名称

azure - 哪里列出了 az 角色分配

sql - Notepad++/Eclipse sql代码自动缩进选项?