Имя столбца и / или имя таблицы в качестве параметров - PullRequest
2 голосов
/ 26 апреля 2011

С учетом следующего фрагмента (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

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Вам придется использовать динамический 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 - я не знаю, как вы будете заполнять переменные здесь, и здесь может быть определенная опасностьпри этом.

РЕДАКТИРОВАТЬ: Добавлен полный код.

0 голосов
/ 07 июля 2011

Этот код является очень хорошим примером для динамического столбца с курсором, так как вы не можете использовать '+' в операторе @.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...