【问题标题】:How to pass table name and column name dynamic in SQL如何在 SQL 中动态传递表名和列名
【发布时间】:2020-07-31 14:31:48
【问题描述】:

我试图动态传递表名和列名,这是作为 SSIS 进程的一部分,我正在下面尝试这个存储过程。

CREATE PROCEDURE [lnd].[Get_ANCNotullColumn]
    (@PassedTableName AS NVarchar(255),
     @PassedColumnName AS NVARCHAR(100)) 
AS
BEGIN  
    DECLARE @ActualTableName AS NVarchar(255)

    SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = @PassedTableName

    DECLARE @sql AS NVARCHAR(MAX)

    SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

    DECLARE @final AS NVARCHAR(MAX)

    SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '='''

    EXEC(@SQL)
END

执行此操作时,我没有得到计数结果,而是执行成功。

EXEC [lnd].[Get_ANCNotullColumn] 'lnd.ANC_LND_ItemOverride', 'comments' 

我需要将计数作为输出。

另外我的简单直接查询是这样的

SELECT COUNT(*) 
FROM lnd.ANC_LND_ItemOverride  
WHERE Comments IS NULL OR Comments = '' -- 3 is the output

【问题讨论】:

  • 这是 SQL Server 吗?
  • @LajosArpad 是的
  • 我已经很长时间没有使用 SQL Server 了,所以与其写答案,不如开始聊聊这个问题。您可以创建一个存储函数而不是一个过程,声明一个计数变量,选择 count(*) 到计数并返回结果。或者,您可以将其保留为存储过程并具有一个输出参数并选择该输出参数。

标签: sql stored-procedures dynamic


【解决方案1】:

我认为您可能需要修改值传递和连接值。

您需要从该语句中删除分号,因为它会引发错误

SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ';'

在传递空白值时,您需要额外的引号

SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '= '''''

执行时我相信你想执行 final 而不是 SQL

我认为下面应该给出你的输出:

CREATE PROC [lnd].[Get_ANCNotullColumn]( @PassedTableName as NVarchar(255),@PassedColumnName AS 
     NVARCHAR(100)) 
 AS
 BEGIN
 DECLARE @ActualTableName AS NVarchar(255)

SELECT @ActualTableName = QUOTENAME( TABLE_NAME )
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = @PassedTableName

DECLARE @sql AS NVARCHAR(MAX)
SELECT @sql = 'SELECT COUNT(*) FROM ' + @ActualTableName + ' '

DECLARE @final AS NVARCHAR(MAX)
SELECT @final = @sql + 'WHERE ' + @PassedColumnName + ' IS NULL  OR ' + @PassedColumnName + '='''''

EXEC(@final)
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多