0

我有一个这样的存储过程。必须声明表变量(动态查询)

ALTER PROCEDURE [dbo].[storedProc_dataPull] 
    @serverName nvarchar(30), 
    @dbName nvarchar(30), 
    @tblName nvarchar(30), 
    @schemaName nvarchar (30), 
    @userID nvarchar (30), 
    @password nvarchar (30), 
    @sampleTbl nvarchar (30) 
AS 
BEGIN 
    DECLARE @schemaAndTbl nvarchar (39) 

    SET @schemaAndTbl = @dbName + '.' + @schemaName + '.' [email protected] 

    EXEC('INSERT INTO @sampleTbl 
     ([ID] 
     ,[ActivityDefinitionID] 
     ,[ParentID] 
     ,[Caption] 
     ,[Description] 
     ,[ShortDescription] 
     ,[Name] 
     ,[Order] 
     ,[ReferenceNumber] 
     ,[ShowOnNavigation] 
     ,[Status] 
     ,[InUseBy] 
     ,[ExpectedStartDate] 
     ,[ActualStartDate] 
     ,[ExpectedEndDate] 

    SELECT * 
    FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 

    UPDATE @sampleTbl 
    SET ServerName = ''[email protected]+'', DBName = ''[email protected]+'' 
    WHERE ServerName IS NULL AND DBName IS NULL 
END 

当我试图执行,我总是得到一个错误:

Must declare the table variable

我的下一个问题是要通过列名作为参数也是如此。

SQL Server有可能吗?我只想为我的应用程序创建一个动态存储过程。

回答

2

您还没有在动态查询中声明@sampleTbl

而表变量范围仅限于该批次的执行。并且Exec语句将批量执行语句。因此,声明,插入,选择&更新表变量必须和应该在同一批次中。意思是它应该包含在EXEC声明中。

2问题:我的下一个问题是传递列名作为参数。

是的,它是可能的sp_executesql

看一看sp_executesql (Transact-SQL)的一样。

0

你可以修改你的语句, 或者你可以定义一个自定义的数据类型基于表变量的结构。比你可以在sp_executesql

INSERT INTO @sampleTbl 
EXEC(' SELECT 
    ([ID] 
    ,[ActivityDefinitionID] 
    ,[ParentID] 
    ,[Caption] 
    ,[Description] 
    ,[ShortDescription] 
    ,[Name] 
    ,[Order] 
    ,[ReferenceNumber] 
    ,[ShowOnNavigation] 
    ,[Status] 
    ,[InUseBy] 
    ,[ExpectedStartDate] 
    ,[ActualStartDate] 
    ,[ExpectedEndDate] 

SELECT * FROM OPENDATASOURCE(''SQLOLEDB'',''Data Source=' + @serverName+ ';User ID='[email protected]+';Password=' [email protected]+''').'[email protected]+' sdb1') 
1

示例表@sampleTbl是您的存储过程中的参数。这也是类型nvarchar (30)。这是不正确的。我不明白你为什么想把这张表作为参数传递给你。如果你想传递表作为参数,那么你应该声明它为一个TYPE并且该表应该作为READONLY传递。您将无法在该表中写入值。从参数中删除它,并修改上述答案中提到的查询。它会工作..

快乐编码:)