如何将表名作为参数传递

sac*_*ana 1 sql-server sqlcmd

我有这个代码

ALTER PROCEDURE [dbo].[tablepass12]
    (@TableName nvarchar(20))
AS
BEGIN
    DECLARE @SQL VARCHAR(8000)

    SELECT @SQL = 'SQLCMD -S ICB3110\SQLEXPRESS -d teena -E -Q "SELECT * FROM "'+@TableName+' -o d:\processing\'+@TableName+'.csv' 

    EXEC MASTER..XP_CMDSHELL @SQL
END;
Run Code Online (Sandbox Code Playgroud)

执行它时,我收到此错误

消息 105,级别 15,状态 1,服务器 ICB3110\SQLEXPRESS,第 1 行
字符串 'AIR_LINE ' 后的未闭合引号。

消息 102,级别 15,状态 1,服务器 ICB3110\SQLEXPRESS,第 1 行
“AIR_LINE”附近的语法不正确。

Sol*_*zky 5

正如错误所述:

非封闭引号

你的字符串是:

'SQLCMD -S ICB3110\SQLEXPRESS -d teena -E -Q "SELECT * FROM "'+@TableName+' -o d:\processing\'+@TableName+'.csv'
Run Code Online (Sandbox Code Playgroud)

一旦@TableName变量被替换为它的值,字符串就会呈现为:

'SQLCMD -S ICB3110\SQLEXPRESS -d teena -E -Q "SELECT * FROM "AIR_LINE -o d:\processing\AIR_LINE.csv'
Run Code Online (Sandbox Code Playgroud)

如果查看-Q参数,它的格式错误为:

"SELECT * FROM "AIR_LINE
Run Code Online (Sandbox Code Playgroud)

您只需要将双引号 ( ") 移到变量的另一侧(它应该在 的左侧,而-o不是在 的右侧FROM):

'SQLCMD -S ICB3110\SQLEXPRESS -d teena -E -Q "SELECT * FROM '+@TableName+'" -o d:\processing\'+@TableName+'.csv'
Run Code Online (Sandbox Code Playgroud)