我有一个简单的SQLCMD脚本,包括这样的一些行:
/* Load data into Exampletable */
BULK INSERT dbo.Example
/* NOTE: I've tried single AND double quotes here. */
FROM "C:\Example Filepath\test.csv"
WITH
(
/* skip the first row containing column names */
FIRSTROW = 2,
/* specify how fields are separated */
FIELDTERMINATOR = '|',
/* specify how lines end */
ROWTERMINATOR = '\n'
)
Run Code Online (Sandbox Code Playgroud)
当我在命令行上运行它时,我收到如下错误:
Sqlcmd: 'C:\Example': Invalid filename.
我认为在路径中有一个空格会导致路径被切断,但我无法找出有效的语法.有没有人有这方面的经验?
我正在创建一个类库,它将.SQL文件作为输入(FileInfo)和一个连接字符串.然后它尝试对连接执行sql文件.
我决定支持Microsoft的SMO和SQLCMD.exe
在测试中,我注意到在我的环境中的许多机器上,默认情况下没有安装SQLCMD.尝试运行进程SQLCMD.exe时出现程序错误.
在不搜索整个硬盘的情况下寻找它的正确方法是什么?是否有一个通用的注册表位置,指定它是否已安装?通常在安装时,我认为设置了PATH位置.
非常感谢.
有没有办法运行查询,然后让SQL Server管理工作室或sqlcmd或其他东西只显示收到的每列的数据类型和大小.
似乎必须存在此信息才能在服务器和客户端之间传输数据.如果可以显示它对我非常有帮助.
一点背景: 我问的原因是因为我必须与无数遗留存储过程接口,每个存储过程的代码范围为50到5000多行.我不想尝试跟随临时表中的神秘逻辑流进入其他过程,进入字符串连接的eval语句等等.我希望不了解实施情况,只是在工作时会发生什么.不幸的是,遵循逻辑流程似乎是唯一的方法来确定究竟是什么被返回而不试图推断管理工作室工作室的数据字符串表示的实际类型或例如.net中的本机类型.
澄清:我不是在询问如何告诉表格的类型或类似的静态.我很确定像sp_help这样的东西对我没用.我问如何告诉我的SQL服务器类型(即varchar(25),int ...)是什么.此外,无法更改sprocs的实现,因此请在您的解决方案中考虑这一点.我真的希望有一个我错过了某个地方的命令.非常感谢所有人.
更新 我想我真正问的是当结果集来自使用临时表的查询时如何获取结果集的模式.我理解这是不可能的,但是对于这个结论没有多大意义,因为数据毕竟是传输的.以下是可能导致问题的存储过程示例.
CREATE PROCEDURE [dbo].[IReturnATempTable]
AS
Create table #TempTable
(
MyMysteryColumn char(50)
)
INSERT #TempTable (
MyMysteryColumn
) VALUES (
'Do you know me?' )
select TOP 50 * FROM #TempTable
Run Code Online (Sandbox Code Playgroud) 我陷入了SQL Server 2005的一个相当奇怪的问题,它抛出了
"插入记录时应设置SET QUOTED IDENTIFIER"
(用作SP)到特定表.这工作得很好,但随机抛出这个错误.
我已经验证了SP.我们没有在里面手动指定SET QUOTED IDENTIFIER设置,因此默认情况下它必须为ON.
有人可以澄清可能是什么问题吗?
必须使用SET QUOTED IDENTIFIER ON创建表格吗?我还没检查表脚本.
我观察到这个问题只发生在SP在日期列上执行插入或更新(modifiedAt)...示例值为'2009-08-10 06:43:59:447'..
传递的值是否有问题?
如何在执行SQL脚本文件时获取SQLCMD,只输出遇到的任何错误或警告?
我基本上不希望输出基于信息的消息.
在SSDT项目中(使用VS2017/VS2015,SSDT版本15.1.61702.140),我无法构建我的项目.编译器一直在我的PostDeploymentScript中抱怨sql语句(是的,我已经将BuildAction属性设置为PostDeploy).sql语句是:
if ('$(env)' = 'dvp')
BEGIN
PRINT 'creating users for dvp'
:r .\SecurityAdditions\usersdvp.sql
END
ELSE IF ('$(env)' = 'qat')
BEGIN
PRINT 'creating users for qat'
:r .\SecurityAdditions\usersqat.sql
END
Run Code Online (Sandbox Code Playgroud)
实际的错误消息是:
D:\My\File\Path\PostDeploymentScript.sql (lineNum, col): Error: SQL72007:
The syntax check failed 'Unexpected end of file occurred.' in the batch near:
Run Code Online (Sandbox Code Playgroud)
在最后一行(结束)的错误消息中引用的行号.知道是什么导致了这个吗?
我有一个脚本文件,例如test.sql.我想用sqlcmd模式中的另一个脚本调用caller.sql来调用它:r test.sql.这工作正常,但我想在test.sql中使用脚本变量.当我从caller.sql调用test.sql时,我可以设置脚本变量,一切都很好.但是,我想使用脚本值的默认值,以便如果调用者没有设置变量,或者我直接运行test.sql(而不是从caller.sql),那么脚本变量默认为设置值.
我尝试过诸如此类的东西
begin try
select '$(grip)'
select 'grip value was found'
end try
begin catch
select 'grip value was missing'
end catch
Run Code Online (Sandbox Code Playgroud)
但我得到以下消息:发生了致命的脚本错误.未定义可变夹点.
我在test.sql中需要什么才能处理调用者传递的"grip"?我正在使用MS SQL 2005
我正在尝试在运行SQL Server 2005的Windows机器上使用sqlcmd来编写查询到csv文件.我们通常使用的命令行选项是:
-l 60 -t 300 -r 1 -b -W -h -1
Run Code Online (Sandbox Code Playgroud)
但是,列被截断为256字节.为了避免这种情况,我尝试使用此命令行选项代替-W:
-y 8000
Run Code Online (Sandbox Code Playgroud)
这捕获了整个字段,但是这个方法的问题是由于所有额外的空间,文件从超过1mb到大约200mb(我意识到8000可能是矫枉过正,但它可能必须至少4000并且我目前只处理一小部分数据).-W选项通常会消除所有这些额外空间,但当我尝试将它们一起使用时,它告诉我它们是互斥的.
有没有办法让sqlcmd在这个限制附近,或者是否有人知道另一个程序(如bcp或osql)是否会使这更容易?
编辑: 以下是我们用于获取被截断字段的代码片段(类似的代码用于一堆字段):
SELECT ALIASES.AliasList as complianceAliases,
Run Code Online (Sandbox Code Playgroud)
...
LEFT OUTER JOIN (Select M1.ID, M1.LIST_ID,stuff((SELECT '{|}' + isnull(Content2,'')+' '+isnull(Content3,'')+' '+isnull(Content4,'')+' '+isnull(Content5,'')+' '+isnull(Content6,'')+' '+isnull(Content7,'')
FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M2 with (nolock)
WHERE M1.LIST_ID = M2.LIST_ID and M1.ID = M2.ID and M1.TYPE = M2.TYPE
FOR XML PATH('')
),1,1,'') as AliasList
FROM fs_HOST3_TEST_web.ISI_APP_COMP_MULTI M1 with (nolock)
WHERE M1.LIST_ID = 2001 AND M1.TYPE = 'Aliases'
GROUP BY m1.list_id,m1.ID,m1.Type) as ALIASES …Run Code Online (Sandbox Code Playgroud) 在docker contaier中使用debian linux.我有sqlcmd正常工作,neseccary驱动程序安装和可定位.我知道服务器存在:
root@0feafecac36f:/home/shiny# nmap -p 31010 -sT xxx.xxx.xxx.xxx
Starting Nmap 7.60 ( https://nmap.org ) at 2018-01-25 20:46 UTC
Nmap scan report for nile-h.tmthk.org (xxx.xxx.xxx.xxx)
Host is up (0.019s latency).
PORT STATE SERVICE
31010/tcp filtered unknown
Nmap done: 1 IP address (1 host up) scanned in 0.59 seconds
Run Code Online (Sandbox Code Playgroud)
但是,对于我的生活,我无法弄清楚如何使用sqlcmd连接,我不知道我有什么技巧可以帮助我.此命令导致错误:
sqlcmd -S nile-h.tmthk.org,31010 -U "*********" -P "********"
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : Login timeout expired.
Sqlcmd: Error: Microsoft ODBC Driver 13 for SQL Server : TCP …Run Code Online (Sandbox Code Playgroud) 所以我在使用远程MS SQL Server进行sqlalchemy和pyodbc时遇到了一些麻烦.本地sqlcmd工作正常但不是当我尝试通过python代码读取数据库时.任何帮助,将不胜感激.
环境:
以下sqlcmd正常工作
sqlcmd -S {Host},{Port} -U {USER} -P {PWD} -Q "use {Database};"
Run Code Online (Sandbox Code Playgroud)
试图直接使用sqlalchemy或pyodbc不起作用.错误:
pyodbc.OperationalError:('HYT00',u'[HYT00] [unixODBC] [Microsoft] [SQL Server的ODBC驱动程序17]登录超时过期(0)(SQLDriverConnect)')
代码:尝试使用pyodbc
conn = pyodbc.connect(
r'DRIVER={ODBC Driver 17 for SQL Server};'
r'SERVER=HOST,PORT;'
r'DATABASE=DATABASE;'
r'UID=UID;'
r'PWD=PWD'
)
Run Code Online (Sandbox Code Playgroud)
尝试使用sqlalchemy:
create_engine('mssql+pyodbc://{user}:{password}@{host}:{port}/{database}?driver={driver}'.format(
user=user,
password=password,
host=host,
database=database,
port=port,
driver="ODBC+Driver+17+for+SQL+Server"
)).connect()
Run Code Online (Sandbox Code Playgroud)
如果我从命令中删除端口,我可以使用sqlcmd重现错误,所以我传递给pyodbc的conn_string可能格式不正确吗?
sqlcmd ×10
sql-server ×8
sql ×4
.net ×1
bash ×1
batch-file ×1
bulkinsert ×1
c# ×1
csv ×1
docker ×1
pyodbc ×1
sqlalchemy ×1
t-sql ×1