【问题标题】:Column-name and/or table-name as parameters列名和/或表名作为参数
【发布时间】:2011-04-26 14:23:16
【问题描述】:

鉴于以下 sn-p (MS SQL):

DECLARE UpdateList CURSOR FOR
SELECT MyColumn FROM MyTable
OPEN UpdateList

到目前为止没有什么特别的。现在我想声明两个变量,我可以在其中写入列名和表名。当然,跟随是行不通的。我怎样才能做到这一点?

DECLARE @TableName nchar(20) = 'MyTable'
DECLARE @ColumnName nchar(20) = 'MyColumn'
DECLARE UpdateList CURSOR FOR
SELECT @ColumnName FROM @TableName
OPEN UpdateList

感谢任何提示 sl3dg3

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

您必须使用动态 SQL - 不能将参数用作表名或列名。所以像:

CREATE TABLE #temp (newcol nvarchar(500)) -- Use the type you're getting out of @TableName
DECLARE @TableName nchar(20) = 'MyTable'
DECLARE @ColumnName nchar(20) = 'MyColumn'

EXEC('INSERT INTO #temp SELECT [' + @ColumnName + '] FROM [' + @TableName + ']')

DECLARE UpdateList CURSOR FOR
SELECT newcol FROM #temp
OPEN UpdateList

请记住与动态 SQL 相关的安全性和性能问题 - 我不知道您将如何在此处填充变量,这样做可能存在一定的危险。

编辑:添加完整代码。

【讨论】:

  • 谢谢 - 这只是我个人使用的脚本,所以这里没有安全风险。你能给我一个例子如何使用光标吗?
  • 已添加 - 必须创建临时表以便您可以对其进行选择,如果您在动态 SQL 中创建它,您的光标将无法看到它(除非您使用全局光标)。
  • 看起来很棒 - 只是因为某种原因我无法选择newcol!?在 select-statement(倒数第二行)中,出现以下错误:Invalid column name 'newcol'.
  • 确保您在CREATE TABLE 语句中创建的列的名称与您从临时表中选择的列的名称相匹配。如果需要,可以使用 exec tempdb..sp_columns #temp 检查临时表的架构。
  • 我需要删除#temp,然后它起作用了(似乎之前包含错误的名称)。 - 谢谢
【解决方案2】:

此代码是带有光标的动态列的一个很好的示例,因为您不能在@statement 中使用'+'。

ALTER PROCEDURE dbo.spTEST
AS
    SET NOCOUNT ON
    DECLARE @query NVARCHAR(4000) = N''
    DECLARE @inputList NVARCHAR(4000) = ''
    DECLARE @field sysname = 'fn'
    DECLARE @my_cur CURSOR
    EXECUTE SP_EXECUTESQL
        N'SET @my_cur = CURSOR FAST_FORWARD FOR SELECT
            CASE @field
                WHEN ''fn'' then fn
            END
            FROM dbo.vCard WHERE [fn] LIKE ''%''+@query+''%'';OPEN @my_cur;',
        N'@field sysname, @query NVARCHAR(4000), @my_cur CURSOR OUTPUT',
        @field = @field,
        @query = @query,
        @my_cur = @my_cur OUTPUT
    FETCH NEXT FROM @my_cur INTO @inputList
    WHILE @@FETCH_STATUS = 0
    BEGIN
        PRINT @inputList
        FETCH NEXT FROM @my_cur INTO @inputList
    END
    RETURN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-16
    • 2013-01-12
    • 2017-11-25
    相关资源
    最近更新 更多