【问题标题】:How to INSERT INTO table column with string/variable如何使用字符串/变量插入表列
【发布时间】:2017-02-24 04:48:22
【问题描述】:

这是我从 powershell 中提取并插入到#temptable 中的数据:

Name                   : SULESRKMA
Location               : Leisure Services - Technology Services
Shared                 : False
ShareName              : 
JobCountSinceLastReset : 0
PrinterState           : 131072
Status                 : Degraded
Network                : False

我正在遍历数据并从标识符中删除了值。我想使用这些标识符将值插入到具有与标识符相同的列名的表中。例如,我有一个名为@identifier = "Name" 的变量和一个列名为Name 的临时表#printers。我想做类似的事情:

SELECT --select statement
INSERT INTO #printers(@identifier)

但这并不奇怪,这似乎不起作用。有没有办法做到这一点? (@identifier 变量将在整个 while 循环过程中更改为数​​据中的其他标识符。)

欢迎任何甚至不涉及使用这种方法的替代建议。我的最终目标只是将这些数据作为一行放入表格中。

(如果这很重要,我目前正在使用 Microsoft SQL Server Management Studio)

【问题讨论】:

    标签: sql-server database tsql powershell printers


    【解决方案1】:

    首先,在这种情况下,您不太可能需要遍历任何内容。当您考虑 SQL 时,请考虑基于集合的操作。

    INSERT INTO #temptable (Column1Name, Column2Name, Column3Name)
    VALUES (@identifer, @anotherIdentifier, @someOtherIdentifier)
    --optional clauses
    WHERE Column1Name = 'some value' OR Column1Name = @someIdentifier
    

    或者你可以SELECT INTO

    SELECT
    @identifier,
    @anotherIdentifer,
    @someOtherIdentifier
    INTO #temptable
    

    对于表中要向其中添加数据的每一列,您的SELECT INTO 中都有一个值,这一点很重要。因此,例如,如果 #temptable 中有 4 列并且您只有 3 个值要插入(列 1、2 和 3),那么您需要 NULL 第 4 列或静态设置它。

    SELECT
    @identifier,
    @anotherIdentifer,
    @someOtherIdentifier,
    NULL
    INTO #temptable
    --or
        SELECT
    @identifier,
    @anotherIdentifer,
    @someOtherIdentifier,
    'static value'
    INTO #temptable
    

    编辑

    如果你想使用一个变量来指定你想插入的列,你必须使用动态 sql。这是一个例子:

    if object_id ('tempdb..#tempTable') is not null drop table #tempTable
    create table #tempTable (Column1Name int, Column2Name int, Column3Name int)
    
    declare @columnName varchar(64) = 'Column1Name'
    declare @sql varchar(max)
    
    set @sql = 
    'insert into #tempTable (' + @columnName + ')
    select 1'
    
    exec(@sql)
    
    select * from #tempTable
    

    【讨论】:

    • 问题是,我不想指定 Column1Name、Column2Name 等。我想用某种方式说“我想将 '@value' 放入由 '@identifier' 指定的列中”我不想将“@identifier”放入表中,我想用它指定列。这有意义吗?
    • 这个麻烦的原因是因为我不想定义10个变量或列来放置数据。我觉得它使查询的可重用性降低。这就是为什么我在遍历标识符(例如“名称”、“位置”、“共享”等)时循环使用此代码的原因(我将在最多有 25 个不同标识符的实例中重用此代码)。
    • 啊它确实@SaniT404 我在上面编辑了它
    • 我了解@SaniT404,您可以使用循环进行变量赋值,即将正确的列名分配给@columnName 或您在光标中使用的任何内容。
    • 提示:使用动态 SQL 时,请时刻准备好来自Bobby Tables 的访问。
    猜你喜欢
    • 2023-02-07
    • 2020-03-19
    • 1970-01-01
    • 2019-02-08
    • 2012-10-26
    • 1970-01-01
    • 2017-03-18
    相关资源
    最近更新 更多