我有这样的存储过程。
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 + '.' +@tblName
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='+@userID+';Password=' +@password+''').'+@schemaAndTbl+' sdb1')
UPDATE @sampleTbl
SET ServerName = ''+@serverName+'', DBName = ''+@dbName+''
WHERE ServerName IS NULL AND DBName IS NULL
END
当我试图执行时,我总是收到错误:
必须声明表变量
我的下一个问题是将列名作为参数传递。
SQL Server可以吗?我只想为我的应用程序创建一个动态存储过程。
答案 0 :(得分:2)
您尚未在动态查询中声明@sampleTbl
。
表变量的范围仅限于批量执行。 Exec
语句将批量执行语句。因此,声明,插入,选择&更新表变量必须且应该在同一批次中。意味着它应该包含EXEC
语句内部。
第二个问题:我的下一个问题是将列名作为参数传递。
是的sp_executesql
答案 1 :(得分:1)
示例表@sampleTbl
是存储过程中的参数。这也是类型nvarchar (30)
。这是不正确的。我不明白你为什么想把这里的表作为参数传递。如果要将表作为参数传递,则应将其声明为TYPE,并将表作为READONLY传递。您将无法在该表中写入值。从参数中删除它并修改上述答案中提到的查询。它会工作..
快乐编码:)
答案 2 :(得分: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='+@userID+';Password=' +@password+''').'+@schemaAndTbl+' sdb1')