更新从文件读取的 SP 定义和 运行 动态 SQL,处理 EOL
Update SP Definition reading from file and run dynamic SQL, deal with EOL
您好,我需要为 SP 创建新定义,其源位于外部物理文件中(从其他 TFS 站点导入,有 1000 多个)。我以为我在第一个 .
就解决了这个问题
但是现在我看到另一个问题,如果您将我的文件读入单行,我收到一个错误 'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
我需要将行尾带入我的 @sql
我现在看到的唯一解决方案是将所有行读入 table 多行,然后将它们连接起来?这是相当复杂的。有没有办法以更紧凑的方式处理 \n'
?下面的代码产生错误。 GO
应该单独在单独的行上。我的全局任务读取 100 多个文件和里面的 运行 代码。
而且我无权访问它们来自的源数据库,只需要处理平面文件。没有任何选项可以右键单击数据库等。
我认为这可能是完全错误的方法,我可以将这些文件放入 TFS/SQL 项目并在 TFS 之外做一些事情,可能应该是应用新代码的某种方式...(?)
CREATE TABLE #imp (Col varchar(max))
BULK INSERT #imp
FROM '//TFSNetwork/log/Install/sp_Test02.sql'
WITH (ROWTERMINATOR = '\nzzzzz') ---<< ?????
select top 1 @Sql = Col from #imp
EXEC (@sql);
--- This is content of my sample file sp_Test02
USE MAGDA_Test
GO
SET ANSI_NULLS ON
GO
/*
Description:
*/
CREATE PROCEDURE [dbo].[sp_Test]
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
SELECT GETDATE() AS TS
END
Actual result: Msg 111, Level 15, State 1, Line 1
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
Expected Result: SP Created OK
--I suspect that SSMS/ doing some own stuff on line breaks, b'z this in this test we still have single line
DECLARE @sql NVARCHAR(MAX) = 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
SELECT @sql --- 1 line
Print @sql --- 2 lineS
使用sqlcmd
您可以为.bat文件中的所有文件编写多个条目,单击运行。这样它就可以很好地处理所有 CR/LF。只需为您的数据库获得足够的权限。
下面是简单的 .bat file.Can use universal CREATE OR ALTER PROCEDURE
inside your .sql
的内容
@echo off
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test01.sql"
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test02.sql"
...
...
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test100.sql"
您好,我需要为 SP 创建新定义,其源位于外部物理文件中(从其他 TFS 站点导入,有 1000 多个)。我以为我在第一个
就解决了这个问题
但是现在我看到另一个问题,如果您将我的文件读入单行,我收到一个错误 'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
我需要将行尾带入我的 @sql
我现在看到的唯一解决方案是将所有行读入 table 多行,然后将它们连接起来?这是相当复杂的。有没有办法以更紧凑的方式处理 \n'
?下面的代码产生错误。 GO
应该单独在单独的行上。我的全局任务读取 100 多个文件和里面的 运行 代码。
而且我无权访问它们来自的源数据库,只需要处理平面文件。没有任何选项可以右键单击数据库等。
我认为这可能是完全错误的方法,我可以将这些文件放入 TFS/SQL 项目并在 TFS 之外做一些事情,可能应该是应用新代码的某种方式...(?)
CREATE TABLE #imp (Col varchar(max))
BULK INSERT #imp
FROM '//TFSNetwork/log/Install/sp_Test02.sql'
WITH (ROWTERMINATOR = '\nzzzzz') ---<< ?????
select top 1 @Sql = Col from #imp
EXEC (@sql);
--- This is content of my sample file sp_Test02
USE MAGDA_Test
GO
SET ANSI_NULLS ON
GO
/*
Description:
*/
CREATE PROCEDURE [dbo].[sp_Test]
AS
BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
SELECT GETDATE() AS TS
END
Actual result: Msg 111, Level 15, State 1, Line 1
'CREATE/ALTER PROCEDURE' must be the first statement in a query batch.
Expected Result: SP Created OK
--I suspect that SSMS/ doing some own stuff on line breaks, b'z this in this test we still have single line
DECLARE @sql NVARCHAR(MAX) = 'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
SELECT @sql --- 1 line
Print @sql --- 2 lineS
sqlcmd
您可以为.bat文件中的所有文件编写多个条目,单击运行。这样它就可以很好地处理所有 CR/LF。只需为您的数据库获得足够的权限。
下面是简单的 .bat file.Can use universal CREATE OR ALTER PROCEDURE
inside your .sql
@echo off
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test01.sql"
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test02.sql"
...
...
sqlcmd -S dbServ10 -U UserAcct -P UserPsw -i "//TFSNetwork/log/Install/sp_Test100.sql"